【问题标题】:Create new column with function in Spark Dataframe based on a string search of another column基于另一列的字符串搜索,在 Spark Dataframe 中创建具有函数的新列
【发布时间】:2016-09-21 12:45:56
【问题描述】:

我有一个 spark 数据框,其中有一列包含字符串值(即“xyztext\afadfa”)。我希望创建一个新列,其中值是“0”或“1”,具体取决于原始列是否包含某些文本(即“文本”)

结果示例:

## +---+---+------+---------+
## | x1| x2|   x3 | xnew    |
## +---+---+------+---------+
## |  1|  a| xtext|    1    |
## |  3|  B| abcht|    0    |

编辑:由于 SGVD,我以前尝试过这个(现在已经添加了 .cast(int)),但是当我插入列名时收到“列不可调用”错误: df1 = df.withColumn('Target', df.column.contains('text').cast('int'))

到目前为止,我取得的最好成绩是通过以下方式创建一个包含 0 的列:

from pyspark.sql.functions import lit
df1 = df.withColumn('Target', lit(0))

我也尝试了 if then else 语句来创建向量,但没有运气:

 def targ(string):
     if df.column.contains('text'): return '1'
     else: return '0'

【问题讨论】:

    标签: python function text apache-spark dataframe


    【解决方案1】:

    Spark 列有一个cast 方法在类型之间进行转换,您可以将布尔类型转换为整数,其中True 转换为1False 转换为0。在 Scala 中,您可以使用 Column#contains 来检查子字符串。 PySpark 没有这个方法,但是可以使用instr 函数代替:

    import pyspark.sql.functions as F
    df1 = df.withColumn('Target', (F.instr(df.column, 'text') > 0).cast('int'))
    

    您也可以将此函数编写为 SQL 表达式:

    df1 = df.withColumn('Target', F.expr("INSTR(column, 'text') > 0").cast('int'))
    

    或者,完全在没有演员表的 SQL 中:

    df1 = df.withColumn('Target', F.expr("IF(INSTR(column, 'text') > 0, 1, 0)"))
    

    【讨论】:

    • 感谢您的帮助。你知道为什么我在插入列名时会不断收到这个错误吗? TypeError Traceback(最近一次调用最后一次) in () ----> 1 df2 = df1.withColumn('Target', df.csuristem.contains('text')。 cast('int')) TypeError: 'Column' object is not callable
    • 我错误地认为 PySpark 中也可以使用 Scala 方法。我已经用一些实际工作的例子编辑了我的答案。
    猜你喜欢
    • 2016-09-02
    • 1970-01-01
    • 2021-07-12
    • 1970-01-01
    • 2020-05-25
    • 2023-02-01
    • 2019-06-05
    • 1970-01-01
    • 2015-07-25
    相关资源
    最近更新 更多