【问题标题】:pyspark dataframe check if string contains substringpyspark数据框检查字符串是否包含子字符串
【发布时间】:2021-11-13 12:18:21
【问题描述】:

我需要帮助将以下 Python 逻辑实现到 Pyspark 数据帧中。

Python: df1['isRT'] = df1['main_string'].str.lower().str.contains('|'.join(df2['sub_string'].str.lower()))

df1.show()

+--------+---------------------------+
|id      |    main_string            |
+--------+---------------------------+
|  1     |    i am a boy             |
|  2     |    i am from london       |
|  3     |    big data hadoop        |
|  4     |    always be happy        |
|  5     |    software and hardware  |
+--------+---------------------------+

df2.show()

+--------+---------------------------+
|id      |    sub_string             |
+--------+---------------------------+
|  1     |        happy              |
|  2     |        xxxx               |
|  3     |    i am a boy             |
|  4     |        yyyy               |
|  5     |    from london            |
+--------+---------------------------+

最终输出: df1.show()

+--------+---------------------------+--------+
|id      |    main_string            | isRT   |
+--------+---------------------------+--------+
|  1     |    i am a boy             |  True  |
|  2     |    i am from london       |  True  |
|  3     |    big data hadoop        |  False |
|  4     |    always be happy        |  True  |
|  5     |    software and hardware  |  False |
+--------+---------------------------+--------+

【问题讨论】:

    标签: pyspark apache-spark-sql


    【解决方案1】:

    先构造子串列表substr_list,然后使用rlike函数生成isRT列。

    df3 = df2.select(F.expr('collect_list(lower(sub_string))').alias('substr'))
    substr_list = '|'.join(df3.first()[0])
    df = df1.withColumn('isRT', F.expr(f'lower(main_string) rlike "{substr_list}"'))
    df.show(truncate=False)
    

    【讨论】:

      【解决方案2】:

      对于您的两个数据框,

      df1 = spark.createDataFrame(['i am a boy', 'i am from london', 'big data hadoop', 'always be happy', 'software and hardware'], 'string').toDF('main_string')
      df1.show(truncate=False)
      df2 = spark.createDataFrame(['happy', 'xxxx', 'i am a boy', 'yyyy', 'from london'], 'string').toDF('sub_string')
      df2.show(truncate=False)
      
      +---------------------+
      |main_string          |
      +---------------------+
      |i am a boy           |
      |i am from london     |
      |big data hadoop      |
      |always be happy      |
      |software and hardware|
      +---------------------+
      
      +-----------+
      |sub_string |
      +-----------+
      |happy      |
      |xxxx       |
      |i am a boy |
      |yyyy       |
      |from london|
      +-----------+
      

      使用简单的连接表达式可以得到以下结果。

      from pyspark.sql import functions as f
      
      df1.join(df2, f.col('main_string').contains(f.col('sub_string')), 'left') \
         .withColumn('isRT', f.expr('if(sub_string is null, False, True)')) \
         .drop('sub_string') \
         .show()
      
      +--------------------+-----+
      |         main_string| isRT|
      +--------------------+-----+
      |          i am a boy| true|
      |    i am from london| true|
      |     big data hadoop|false|
      |     always be happy| true|
      |software and hard...|false|
      +--------------------+-----+
      

      【讨论】:

        猜你喜欢
        • 2011-11-09
        • 2013-05-18
        • 2021-12-14
        • 2021-12-20
        • 2014-11-22
        • 2013-02-05
        • 1970-01-01
        • 2013-03-04
        • 2014-12-10
        相关资源
        最近更新 更多