Pyspark:与部分键连接

Pyspark:与部分键连接,pyspark,inner-join,Pyspark,Inner Join,我有两个数据帧,我想“内部”连接,其中键不相同,但当我删除数据帧1的最后一个字符时,键是相同的 例如: 数据帧1 Key Count ToyotaA 100 ToyotaB 200 AudiA 300 AudiB 400 数据帧2 Key Count Toyota 300 Audi 700 我想创建一个类似于以下的连接,目前不起作用:

我有两个数据帧,我想“内部”连接,其中键不相同,但当我删除数据帧1的最后一个字符时,键是相同的

例如: 数据帧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()

欢迎有任何想法

数组切片
[:-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还不支持udf。

数组切片
[:-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还不支持udf。

谢谢Jaco,PySpark函数起作用了。感谢您确认Spark目前还不支持所需的功能。谢谢Jaco,PySpark功能正常工作。感谢您确认Spark目前还不支持所需的功能。