2017-04-24 39 views
0

我有兩個數據幀我想'內部'加入密鑰不一樣的地方,但是當我丟棄數據幀1的最後一個字符時,密鑰是相同的。Pyspark:加入密鑰的一部分

例: 數據幀1

Key    Count 
ToyotaA   100 
ToyotaB   200 
AudiA   300 
AudiB   400 

數據幀2

Key    Count 
Toyota   300 
Audi   700 

我想作一個加入類似下面,這是不工作的時刻:

TopSales.join(TopSales2, ((TopSales.TIRESIZE[:-1]) == TopSales2.TIRESIZE2, 'inner')).show() 

歡迎任何想法!

回答

2

陣列切片[:-1]在PySpark中不起作用並返回空字符串。下面我列出了兩種可能的解決方法。

如果你樂於使用SparkSQL你可以寫你的加入SQL:

df1 = sc.parallelize([('ToyotaA',100),('ToyotaB',200),('AudiA',300),('AudiB',400)]).toDF(['Key','Count'])  
sqlContext.registerDataFrameAsTable(df1, "df1") 
df2 = sc.parallelize([('Toyota',300),('Audi',700)]).toDF(['Key','Count']) 
sqlContext.registerDataFrameAsTable(df2, "df2") 
df_combined = sqlContext.sql("select df1.Key,df2.Key,df1.Count,df2.Count from df1 df1 inner join df2 df2 on substring(df1.Key, 0, LENGTH(df1.Key) -1) = df2.Key") 
df_combined.show() 

或者,您可以添加一個新列的第一個數據幀包含清洗鍵:

from pyspark.sql.types import StringType 
from pyspark.sql.functions import udf 

substring_udf = udf(lambda value: value[:-1], StringType()) 
df1=df1.withColumn("cleaned_key", substring_udf(df1.Key)) 
df1.join(df2, df1.cleaned_key == df2.Key, 'inner').show() 

最新的解決方案當然是在聯接中使用udf,但是,在寫這篇文章的時候,PySpark尚未支持。

+0

謝謝哈科,PySpark函數的工作。感謝您確認Spark目前尚不支持所需的功能。 –