2017-09-12 17 views
0

CassandraへのSQL移行に取り組んでおり、複数の列を1つの列に結合する際に問題があります。たとえば、1つまたは複数のレースを持つことができる人がいるとします。私は現在、個人レースごとに0または1を持っています。それをセットとして単一の列にどのように組み合わせることができますか?Scala Spark複数の列から新しい列に値を集計する

   SQL Schema 
+----------------------------------+ 
- R_White R_Af_American R_Asian - 
- 1   1   1  - 
- 0   1   1  - 
- 1   0   1  - 
- 0   1   0  - 
+----------------------------------+ 

        Cassandra Temp Desired Schema 
+-------------------------------------------------------------------+ 
- R_White R_Af_American R_Asian   Race      - 
- 1   1   1  ["White","Af American", "Asian"]- 
- 0   1   1  ["Af American", "Asian"]  - 
- 1   0   1  ["White", "Asian"]    - 
- 0   1   0  ["Af American"]     - 
+-------------------------------------------------------------------+ 

私はcsvファイルからデータを読み込むおりますので、私は彼らがそうであるように(レース欄に)結合を実行、SQLからスパークするために、テーブルを読み込むことを計画し、以外のすべての列を削除新しいレースコラム

データの他のデータ操作のために.withColumn()をチェーンしていますが、これはwhen(col( "R_White")=== 1、somehow_add_to_set).otherwise(...)パターン。どんな助けでも大歓迎です!ありがとう!あなたも取り除くことができ

import org.apache.spark.sql.functions._ 
import spark.implicits._ 

val dropNulls = udf { (a: Seq[String]) => a.filter(_ != null) } 

val result = df.withColumn("Race", dropNulls(array(
    when($"R_White"  === 1, "R_White"), 
    when($"R_Af_American" === 1, "R_Af_American"), 
    when($"R_Asian"  === 1, "R_Asian") 
))) 

:それはarray機能を使用して配列し、各値についてwhen式を作成することで、その後、UDFを使用してnull Sを落とすだろう達成するために

+0

あなたは、テーブルのスキーマを提供することができますし、セットに追加何をしたいですか? –

+0

上記はこれ以上明確ですか?私はテーブルを編集し、私のシナリオのもう少し説明を追加しました –

+0

Tzachはすでにそれに答えています。それは助けになりませんでしたか? –

答えて

1

一つの方法これらwhen式にデータフレームの列名をマッピングすることで、ハードコードされた値:

val result = df.withColumn("Race", dropNulls(array(
    df.columns.map(name => when(col(name) === 1, name)): _* 
))) 

result.show(false) 
// +-------+-------------+-------+---------------------------------+ 
// |R_White|R_Af_American|R_Asian|Race        | 
// +-------+-------------+-------+---------------------------------+ 
// |1  |1   |1  |[R_White, R_Af_American, R_Asian]| 
// |0  |1   |1  |[R_Af_American, R_Asian]   | 
// |1  |0   |1  |[R_White, R_Asian]    | 
// |0  |1   |0  |[R_Af_American]     | 
// +-------+-------------+-------+---------------------------------+ 
+0

それは私が必要としたものです、毎回ありがとう! –

関連する問題