【问题标题】:Join DataFrames using Regular Expressions with PySpark使用 PySpark 的正则表达式加入 DataFrame
【发布时间】:2017-02-26 19:22:28
【问题描述】:

我正在寻找一种按键组合两个 DataFrame 的方法。我的 DataFrame 如下所示:

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')]

我的密钥将是 df1 的“account_uid”和 df2 的“gigyaid”。我的代码:

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

实际上,我的 Dataframe 是两个 RDD,在转换为 Datafarmes 后,我得到了具有两种分隔符的 Dataframe:“,”和“^”。所以问题是连接不只将 "_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' ? 任何帮助表示赞赏。谢谢!

【问题讨论】:

    标签: regex join dataframe pyspark spark-dataframe


    【解决方案1】:

    要修复该错误,您的 udf 应该获取两个参数,并且确实需要使用正则表达式,例如:

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

    但这不会很有效,因为它需要为每对 df1df2 元素计算这个 python 函数。您可以使用regexp_extract 来清理连接键,而不是创建笛卡尔连接和过滤:

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

    然后执行数据帧的经典内连接。

    【讨论】:

      猜你喜欢
      • 2019-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-07
      • 1970-01-01
      相关资源
      最近更新 更多