2017-09-14 4 views
0

私はスパークSQL - 単一のアレイに配列の配列

| ColAplusB | 
|-----------| 
|["a", "b"] | 

「アレイの両方からの値を含む単一の列を作成したい文字列

| ColA | ColB | 
|------|------| 
| ["a"]| ["b"]| 

のアレイを有する2つの列を有しています

| ColAplusBnested | 
|-----------------| 
| [["a"], ["b"]] | 

私は望ましい結果を得ることができますどのように(ARRA:私は私を残しarray(ColA, ColB)を試してみました配列のyが初期配列の値の配列に変換されましたか?

+0

検索について「フラット・アレイ/コレクション」と呼ばれています。私はスパークを知らないが、私はそれがカスタムコードなしで実行可能でなければならないと信じている。 – lad2025

+0

私は、フラットニングはそれを行ごとに単一の値に減らすと信じています。これは正確には私が探しているものではありません。 'explode'はそれを行いますが、すべての値を1つの配列に戻す方法がわかりません。 – 3yakuya

+0

私は 'flatten(array(ColA、ColB))'のようなものを意味します。 – lad2025

答えて

1

のは、あなたのデータは、このようなものですとしましょう:

val df = spark.sqlContext.createDataFrame(Seq(
    (Array("a"), Array("b")) 
)).toDF("ColA", "ColB") 
df.printSchema() 
df.show() 

root 
|-- ColA: array (nullable = true) 
| |-- element: string (containsNull = true) 
|-- ColB: array (nullable = true) 
| |-- element: string (containsNull = true) 

+----+----+ 
|ColA|ColB| 
+----+----+ 
| [a]| [b]| 
+----+----+ 

existing set of Spark SQL functionsは、アレイ(または列)のための連結機能を持つように表示されません。私は文字列のためのconcat関数を見るだけです。しかし、あなたは、単純なユーザー定義関数(UDF)を作成することができます

import org.apache.spark.sql.functions.udf 

val concatSeq = udf { (x: Seq[String], y: Seq[String]) => x ++ y } 
val df2 = df.select(concatSeq('ColA, 'ColB).as("ColAplusB")) 
df2.printSchema() 
df2.show() 

root 
|-- ColAplusB: array (nullable = true) 
| |-- element: string (containsNull = true) 

+---------+ 
|ColAplusB| 
+---------+ 
| [a, b]| 
+---------+ 

あなたは(例えば重複を削除、並べ替え)あなたのUDFで行うことができます実行したい余分なロジック:

val df = spark.sqlContext.createDataFrame(Seq(
    (Array("b", "a", "c"), Array("a", "b")) 
)).toDF("ColA", "ColB") 

df.show() 

+---------+------+ 
|  ColA| ColB| 
+---------+------+ 
|[b, a, c]|[a, b]| 
+---------+------+ 

val concatSeq = udf { (x: Seq[String], y: Seq[String]) => 
    (x ++ y).distinct.sorted 
} 

df.select(concatSeq('ColA, 'ColB).as("ColAplusB")).show() 

+---------+ 
|ColAplusB| 
+---------+ 
|[a, b, c]| 
+---------+ 
関連する問題