【问题标题】:Getting null values when converting pyspark.rdd.PipelinedRDD object into Pyspark dataframe将 pyspark.rdd.PipelinedRDD 对象转换为 Pyspark 数据框时获取空值
【发布时间】:2021-06-19 02:57:56
【问题描述】:

我的数据集有一列名为“eventAction”。

它具有“conversion”、“purchase”、“check-out”等值。我想将此列转换为将转换映射到 1 并将所有其他类别映射到 0。

我是这样使用 lambda 函数的:

e1 = event1.rdd.map(lambda x: 1 if x.eventAction == 'conversion' else 0)

其中 event1 是我的 spark 数据框的名称。

当打印 e1 时,我明白了:

print(e1.take(5))
[0, 0, 0, 0, 0]

所以我认为 lambda 函数工作正常。现在,当我转换为 pyspark 数据框时,我得到如下所示的空值:

schema1 = StructType([StructField('conversion',IntegerType(),True)])
df = spark.createDataFrame(data=[e1],schema=schema1)
df.printSchema()
df.show()

如果你能帮助我,那就太好了。

谢谢!

【问题讨论】:

    标签: python apache-spark pyspark apache-spark-sql rdd


    【解决方案1】:

    spark.createDataFrame 需要 Row 的 RDD,而不是整数的 RDD。在转换为数据框之前,您需要将 RDD map 转换为 Row 对象。请注意,无需在e1 周围添加方括号。

    from pyspark.sql import Row
    
    e1 = event1.rdd.map(lambda x: 1 if x.eventAction == 'conversion' else 0).map(lambda x: Row(x))
    schema1 = StructType([StructField('conversion',IntegerType(),True)])
    df = spark.createDataFrame(data=e1,schema=schema1)
    

    也就是说,您尝试做的事情应该可以使用 Spark SQL when 函数轻松完成。无需将 RDD 与自定义 lambda 函数一起使用。例如

    import pyspark.sql.functions as F
    
    df = events.select(F.when(F.col('eventAction') == 'conversion', 1).otherwise(0).alias('conversion'))
    

    【讨论】:

    • 嗨@mck,我想问一下,如果让我们说 event1 数据框有超过 1 列,那么使用这些解决方案将导致丢失其他列。您能否建议我如何更改 eventAction 列并让其他人保持原样。提前致谢。
    • 使用withColumn
    • 感谢@mck 的快速回复。我实际上是 Pyspark 的新手,并不擅长它。所以可能会问一些愚蠢的问题。我将withColumn 尝试为:event1.withColumn('eventAction') = spark.createDataFrame(data=e1,schema=schema1) 但是,我收到此错误:SyntaxError: can't assign to function call
    • 请阅读文档:spark.apache.org/docs/3.0.2/api/python/…。它应该与数据框一起使用,例如在我答案的第二个代码 sn-p 中
    • 谢谢@mck。如果可能的话,只需要更多帮助:我试过这个:event1.withColumn('eventAction', event1.select(F.when(F.col('eventAction') == 'conversion', 1).otherwise(0))).collect() 但我收到了这个错误:AssertionError: col should be Column 如果你能在这里给我一些指导,那就太好了。非常感谢。
    猜你喜欢
    • 2021-11-18
    • 2018-06-15
    • 2021-06-12
    • 1970-01-01
    • 2018-12-06
    • 2022-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多