2017-06-22 11 views
2

文字列として読み込まれた列を配列の列に変換するにはどうすればよいですか? はすなわち、スキーマSpark:文字列の列を配列に変換する

scala> test.printSchema 
root 
|-- a: long (nullable = true) 
|-- b: string (nullable = true) 

+---+---+ 
| a| b| 
+---+---+ 
| 1|2,3| 
+---+---+ 
| 2|4,5| 
+---+---+ 

以下から変換する:可能な場合は

scala> test1.printSchema 
root 
|-- a: long (nullable = true) 
|-- b: array (nullable = true) 
| |-- element: long (containsNull = true) 

+---+-----+ 
| a| b | 
+---+-----+ 
| 1|[2,3]| 
+---+-----+ 
| 2|[4,5]| 
+---+-----+ 

スカラ座やPython実装の両方を共有してください。 関連するノートでは、ファイル自体を読み込む際にどのように気をつけますか? 〜450列のデータがあり、この形式で指定したいデータはほとんどありません。 は現在、私は以下のようにpysparkに読んでいます:

df = spark.read.format('com.databricks.spark.csv').options(
    header='true', inferschema='true', delimiter='|').load(input_file) 

感謝を。

答えて

5

様々な方法がありますが、

ます。また、値を変換するための簡単なUDFを作成することができますarray<long>

data.withColumn("b", split(data("b"), ",").cast("array<long>")) 

split機能とキャストを使用している行うための最善の方法

val tolong = udf((value : String) => value.split(",").map(_.toLong)) 

test.withColumn("newB", tolong(data("b"))).show 

お役に立てれば!

0

UDFを使用すると、正確に必要なスキーマが得られます。このように、次のよう

val toArray = udf((b: String) => b.split(",").map(_.toLong)) 

val test1 = test.withColumn("b", toArray(col("b"))) 

それはあなたのスキーマを与えるだろう:

scala> test1.printSchema 
root 
|-- a: long (nullable = true) 
|-- b: array (nullable = true) 
| |-- element: long (containsNull = true) 

+---+-----+ 
| a| b | 
+---+-----+ 
| 1|[2,3]| 
+---+-----+ 
| 2|[4,5]| 
+---+-----+ 

を限り自体を読んでファイルにスキーマを適用することが懸念されるとして、私はタフな仕事だと思います。したがって、DataFrameReadertestを作成した後に変換を適用することができます。

こちらがお役に立てば幸いです。

関連する問題