2017-08-30 46 views
0

我在Spark DF中有一個Map列,並且想要在特定鍵上過濾此列(即,如果地圖中的鍵與所需值匹配,則保留該列)。如何檢查Pyspark地圖中是否存在關鍵字或值

例如,我的模式被定義爲:

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

我的樣本數據是:

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

有什麼辦法來篩選的行我DF其中,「一」是「等級「不使用爆炸()?

是否有比給定的json更好的模式表示?

+0

'explode'可能是最好的解決方案。如果你不想使用它,你將不得不寫一個UDF – MaFF

+0

謝謝@Marie。您能否建議我如何編寫一個UDF來做到這一點,或者提供關於訪問Map類型的鍵值屬性的指導。我也嘗試通過sqlContext.sql(「select test.df中的select rank.key」)訪問Map鍵,但這不起作用。 – Stephan

回答

1

使用rank.key訪問密鑰意味着rankStructType()。雖然爆炸可能是最好的解決方案,讓我們建立一個UDF來評估k是否是rank的關鍵。

首先我們來創建數據幀:

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| 
    +----------+-------------------+------+ 
相關問題