2016-10-17 87 views
0

我正在寻找一种按键组合两个数据框的方法。我DataFrames是这样的:使用PySpark使用正则表达式加入数据框

df1 : 
[Row(account_uid=u"_guid_P3p2_4VlUa1taKzzYUlDkC1gv0xe3GE9DDr4IWK1P6Y=^facebook^TRUE^TRUE^FALSE^FALSE^62.36^fr_FR^facebook^10210866419602223^f^20^1996-02-21^Aude^TRUE^FALSE^fr_FR^2016-10-09^2016-10-04, work_titles=None, work_locations=None, d_date=u'2016-10-10'), 
Row(account_uid=u"_guid_Kq6LT407kBCAw0Q2K7y-Q8RxamuAgs9v_w2LINQ2jRk=^facebook^TRUE^TRUE^FALSE^TRUE^30.85^fr_FR^facebook^10153156407710064^f^29^1987-02-19^Olivia^TRUE^FALSE^fr_FR^2016-10-09^2016-09-28, work_titles=None, work_locations=None, d_date=u'2016-10-10')] 

df2 : 
[Row(gigyaid=u'_guid_P3p2_4VlUa1taKzzYUlDkC1gv0xe3GE9DDr4IWK1P6Y=', kruxuserids=u'K0EYsC88')] 

我的钥匙将 “account_uid” 为DF1和 “gigyaid” 为DF2。我的代码:

df1.join(df2, df1.account_uid == df2.gigyaid, 'fullouter') 

在现实中,我Dataframes两个RDDS,并转化为Datafarmes后,我得到了Dataframes有两种类型的分隔符:“”和‘^’。所以问题是,联接不只拿“_guid_P3p2_4VlUa1taKzzYUlDkC1gv0xe3GE9DDr4IWK1P6Y =”为account_uid,但所有的字符串,从GUID直到2016年10月4日,这是不对的。 我想用正则表达式选择正确的account_uid。 我想要做这样的事情:

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

contains = udf(lambda x: re.match(r'^(.*?)\^', x), BooleanType()) 

df = (df1.join(df2) 
.where(contains(col('account_uid'), col('gigyaid')))) 

我得到这个错误信息:

enter image description here

这可能吗? 我在哪里可以把连接的类型'fullouter'? 任何帮助表示赞赏。谢谢 !

回答

0

要修正这个错误你的UDF应该得到两个参数,它确实需要使用正则表达式,例如:

contains = udf(lambda long, short: short in long, BooleanType()) 

但是,因为它需要计算每一个这条巨蟒的功能,这将不会是有效的一对df1df2元素。而不是创建笛卡儿连接和过滤,您可以使用regexp_extract清洁加盟键:

from pyspark.sql.functions import regexp_extract 
df1.withColumn("extracted_guid", regexp_extract('account_uid', '(^[^^]*)', 1)) 

,然后执行经典的内部连接dataframes的。