微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将 pyspark.rdd.PipelinedRDD 对象转换为 Pyspark 数据帧时获取空值

如何解决将 pyspark.rdd.PipelinedRDD 对象转换为 Pyspark 数据帧时获取空值

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

它具有诸如“转化”、“购买”、“结帐”等值。我想以一种将转化映射到 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]

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

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

1

如果你能帮我解决这个问题就太好了。

谢谢!

解决方法

spark.createDataFrame 期望 RDD 为 Row,而不是整数 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'))

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。