我正在寻找一种按键组合两个DataFrame的方法。我的DataFrames看起来像这样:
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是两个RDD,在转换为Datafarmes后,我得到了两种类型的分隔符的Dataframes:","和" ^"。所以问题是,加入不仅仅需要" _guid_P3p2_4VlUa1taKzzYUlDkC1gv0xe3GE9DDr4IWK1P6Y =" 作为account_uid,而是来自 guid的所有字符串 直到 2016-10-04 ,这是错误的。 我想用正则表达式选择正确的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'))))
我收到此错误消息:
这可能吗? 我在哪里可以加入联盟的类型' fullouter' ? 任何帮助赞赏。谢谢!
答案 0 :(得分:0)
要修复该错误,您的udf应该获得两个参数,并且确实需要使用正则表达式,例如:
if(Input::get('submit_1') == 'submit_1')
但是这不会有效,因为它需要为每对contains = udf(lambda long, short: short in long, BooleanType())
和df1
元素计算这个python函数。您可以使用df2
清除加入密钥,而不是创建笛卡尔联接和过滤:
regexp_extract
然后执行数据帧的经典内连接。