2017-08-30 10 views
0

私はスパークDFのMap列を持っていて、特定のキーでこの列をフィルタリングしたいと考えています。Pysparkマップにキーまたは値が存在するかどうかを確認する方法

例えば、私のスキーマは次のように定義されています。私のサンプルデータがある

df_schema = StructType(
    [StructField('id', StringType()), 
    StructField('rank', MapType(StringType(), IntegerType()))] 
) 

{ "id": "0981850006", "rank": {"a": 1} } 

は「」ランク」である行の私のDFをフィルタリングする方法はあります"explode()を使わずに?

与えられたJSONのスキーマ表現は、私が定義したものより優れていますか?

+0

を 'explode'は、おそらく最良の解決策です。それを使用したくない場合は、UDF – MaFF

+0

Thanks @ Marieを書く必要があります。これを行うためにUDFを書く方法を提案したり、Mapタイプのキー値属性にアクセスするためのガイダンスを提供してください。また、sqlContext.sql( "select rank.key from test_df")を使用してMapキーにアクセスしようとしましたが、これは機能しません。 – Stephan

答えて

1

rank.keyでキーにアクセスすることは、rankStructType()であることを意味します。おそらくexplodeが最適な解決策ですが、kがrankのキーであるかどうかを評価するためのUDFを構築しましょう。

最初に私たちのデータフレームを作成してみましょう:

from pyspark.sql.types import * 
df_schema = StructType(
    [StructField('id', StringType()), 
    StructField('rank', MapType(StringType(), IntegerType()))] 
) 
df = spark.createDataFrame([ 
    ["0981850006", {"a": 1}], 
    ["0981850006", {"b": 2, "c": 3}], 
], df_schema) 

今私達のUDF:

def isKey(k,d): 
    return k in d.keys() 

isKey_udf = lambda k: psf.udf(lambda d: isKey(k,d), BooleanType()) 

与える:

df.withColumn(
    "is_key", 
    isKey_udf('a')(df.rank) 
) 
    +----------+-------------------+------+ 
    |  id|    rank|is_key| 
    +----------+-------------------+------+ 
    |0981850006|  Map(a -> 1)| true| 
    |0981850006|Map(b -> 2, c -> 3)| false| 
    +----------+-------------------+------+ 
関連する問題