2017-05-24 16 views
1

私は、String型の7-8フィールドからなるデータセットを持っています。& Floatです。Spark - 異なるデータ型を使用してプログラムでスキーマを作成する

val schema = StructType(header.split(",").map(column => StructField(column, StringType, true))) 

、その後のようなタイプを行にそれをマッピング:

はこれを使って、プログラム的なアプローチにより、スキーマを作成しようとしています

val dataRdd = datafile.filter(x => x!=header).map(x => x.split(",")).map(col => Row(col(0).trim, col(1).toInt, col(2).toFloat, col(3), col(4) ,col(5), col(6), col(7), col(8))) 

しかし、私はDF.showを使用するときにデータフレームを作成した後に( )Integerフィールドにエラーが発生します。

それでは、どのデータセットに

答えて

1

を、我々は複数のデータ型を持っているようなスキーマを作成するには、コードを持っている問題は、あなたがStringTypeなど、すべてのフィールドを割り当てているということです。

ヘッダーにフィールドの名前しかないと仮定すると、その型は推測できません。

あなたが一方

root 
|-- field1:Int: integer (nullable = true) 
|-- field2:Double: double (nullable = true) 
|-- field3:String: string (nullable = true) 

を取得後、コードはヘッダの文字列例えば

def inferType(field: String) = field.split(":")(1) match { 
    case "Int" => IntegerType 
    case "Double" => DoubleType 
    case "String" => StringType 
    case _ => StringType 
} 

val schema = StructType(header.split(",").map(column => StructField(column, inferType(column), true))) 

する必要がありますのは、ヘッダ文字列がこの

val header = "field1:Int,field2:Double,field3:String" 

のようなものであると仮定しよう。必要なものがテキストのデータフレームであれば、ファイル自体からDataFrameを直接作成することをお勧めします。 RDDから作成するのは無意味です。第1の構造タイプの定義

val fileReader = spark.read.format("com.databricks.spark.csv") 
    .option("mode", "DROPMALFORMED") 
    .option("header", "true") 
    .option("inferschema", "true") 
    .option("delimiter", ",") 

val df = fileReader.load(PATH_TO_FILE) 
+0

ヘッダー文字列はこのようではなく、データは 'dfs8768768、65,76.34,234、dfgdg、34.65 dfs8768768,65,76.34,234、dfgdg、34.65' – AJm

+0

のようになります。ヘッダから知ることは不可能です提供されていないデータの種類。 – elghoto

+0

これはヘッダと正確データである: '競売、入札、bidtime、入札者、bidderrate、openbid、価格、商品、daystolive 8213034715,15,12.373、baman、3,12,20、book1,5 8213034725、 65,21.33、thmpu、2,64,75、watch1,9 8213034735,85,23.3、lovekush、4,45,90、remote1,10 8213034745,115,44.44、jaipanee、3,111,130、s3phone、4' – AJm

1

val schema1 = StructType(Array(
    StructField("AcutionId", StringType, true), 
    StructField("Bid", IntegerType, false), 
    StructField("BidTime", FloatType, false), 
    StructField("Bidder", StringType, true), 
    StructField("BidderRate", FloatType, false), 
    StructField("OpenBid", FloatType, false), 
    StructField("Price", FloatType, false), 
    StructField("Item", StringType, true), 
    StructField("DaystoLive", IntegerType, false) 
)) 

そして特定のタイプに変換することにより、行の内部に存在bに起こっている各列を指定:

val dataRdd = datafile.filter(x => x!=header).map(x => x.split(",")) 
    .map(col => Row(
    col(0).trim, 
    col(1).trim.toInt, 
    col(2).trim.toFloat, 
    col(3).trim, 
    col(4).trim.toFloat, 
    col(5).trim.toFloat, 
    col(6).trim.toFloat, 
    col(7).trim, 
    col(8).trim.toInt) 
) 

そして適用RDDへのスキーマ

val auctionDF = spark.sqlContext.createDataFrame(dataRdd,schema1) 
関連する問題