2016-09-01 6 views
1

私はSpark(2.0)でSpark SQLに取り組んでおり、CSVを読むためにJava APIを使用しています。データセットの文字列を分割する<Row>コンマで新しいデータセットを取得<Row>

CSVファイルには、カンマ区切りの列が二重引用符で囲まれています。例:CSVを読み取り、データセットを返すため"Express Air,Delivery Truck"

コード:

Dataset<Row> df = spark.read() 
       .format("com.databricks.spark.csv") 
       .option("inferSchema", "true") 
       .option("header", "true") 
       .load(filename) 

結果:

+-----+--------------+--------------------------+ 
|Year |  State |    Ship Mode |... 
+-----+--------------+--------------------------+ 
|2012 |New York  |Express Air,Delivery Truck|... 
|2013 |Nevada  |Delivery Truck   |... 
|2013 |North Carolina|Regular Air,Delivery Truck|... 
+-----+--------------+--------------------------+ 

しかし、私はデータセットとしてMode1からShop ModeMode2柱とリターンを分割したいです。

+-----+--------------+--------------+---------------+ 
|Year |  State |  Mode1 |   Mode2 |... 
+-----+--------------+--------------+---------------+ 
|2012 |New York  |Express Air |Delivery Truck |... 
|2013 |Nevada  |Delivery Truck|null   |... 
|2013 |North Carolina|Regular Air |Delivery Truck |... 
+-----+--------------+--------------+---------------+ 

Java Sparkを使用してこれを行う方法はありますか?

私はMapFunctionで試しましたが、call()メソッドはRowを返さなかった。 Ship Modeは動的です。つまり、CSVには1つまたは2つの船舶モードが含まれます。

ありがとうございました。

df.selectExpr("Year","State","split(Ship Mode, ',')[0] as Mode1","split(Ship Mode, ',')[1] as Mode2"); 

結果は、行のデータセットである:

答えて

1

あなたはselectExprSQL式このようなを受け付ける選択のバリアントを使用することができます。

+0

カンマ区切りの値の数が不明な場合は、別の方法を提案できますか? col1、col2、....からcol40まで変化する可能性があります。それは40で最大です。 –

1

我々は可能性:

  • 、2つの新しい列

に分割さ列をマップするために選択式を使用して一度だけ

  • 分割操作を行うには、ユーザー定義関数(UDF)を定義例:

    import org.apache.spark.sql.functions._ 
    import org.apache.spark.sql.{Column, Row} 
    
    val splitter = udf((str: String) => { 
        val splitted = str.split(",").lift 
        Array(splitted(0), splitted(1)) 
    }) 
    
    val dfShipMode = df.select($"year",$"state", splitter($"shipMode") as "modes") 
            .select($"year", $"state", $"modes"(0) as "mode1", $"modes"(1) as "mode2") 
    
  • 関連する問題