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を落とすだろう達成するために
あなたは、テーブルのスキーマを提供することができますし、セットに追加何をしたいですか? –
上記はこれ以上明確ですか?私はテーブルを編集し、私のシナリオのもう少し説明を追加しました –
Tzachはすでにそれに答えています。それは助けになりませんでしたか? –