2016-06-14 3 views
1

でのArrayType列の別個の要素を取得します。 feat1feat2は、文字列の配列の形式は以下のとおりであるIは<em>ID</em>、<em>feat1</em>と<em>feat2</em>命名3列のデータフレームを有するスパークデータフレーム

Id, feat1,feat2 
------------------ 
1, ["feat1_1","feat1_2","feat1_3"],[] 

2, ["feat1_2"],["feat2_1","feat2_2"] 

3,["feat1_4"],["feat2_3"] 

私は各機能の列内の個別の要素のリストを取得したいので、出力は次のようになります。

distinct_feat1,distinct_feat2 
----------------------------- 
["feat1_1","feat1_2","feat1_3","feat1_4"],["feat2_1","feat2_2","feat2_3] 

Scalaでこれを行う最善の方法は何ですか?

答えて

1

各列にexplode関数を適用した後に、対応する列の異なる値を見つけるためにcollect_setを使用して、各セルの配列要素のネスト解除を行うことができます。あなたのデータフレームがdfと呼ばれていると仮定します

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

val distinct_df = df.withColumn("feat1", explode(col("feat1"))). 
        withColumn("feat2", explode(col("feat2"))). 
        agg(collect_set("feat1").alias("distinct_feat1"), 
         collect_set("feat2").alias("distinct_feat2")) 

distinct_df.show 
+--------------------+--------------------+ 
|  distinct_feat1|  distinct_feat2| 
+--------------------+--------------------+ 
|[feat1_1, feat1_2...|[, feat2_1, feat2...| 
+--------------------+--------------------+ 


distinct_df.take(1) 
res23: Array[org.apache.spark.sql.Row] = Array([WrappedArray(feat1_1, feat1_2, feat1_3, feat1_4), 
               WrappedArray(, feat2_1, feat2_2, feat2_3)]) 
+0

お返事ありがとうございました。あなたが描いたように機能します。フィーチャー列の数があらかじめ分かっていない場合は、ハードコーディングを必要としないソリューションについて考えることができますか? –

+0

SparkRでこれをどうやってやりますか? – nate

+0

@MasoudTavazoei少し遅れましたが、ハードコードされていない値でも動作するバージョンの答えが表示されます。 –

0

Psidomによって提供される方法は、素晴らしい作品、ここではデータフレームとフィールドのリスト与えられた同じことを行う関数である:

def array_unique_values(df, fields): 
    from pyspark.sql.functions import col, collect_set, explode 
    from functools import reduce 
    data = reduce(lambda d, f: d.withColumn(f, explode(col(f))), fields, df) 
    return data.agg(*[collect_set(f).alias(f + '_distinct') for f in fields]) 

そしては:

data = array_unique_values(df, my_fields) 
data.take(1) 
関連する問題

 関連する問題