如何解决将 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()
如果你能帮我解决这个问题就太好了。
谢谢!
解决方法
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 举报,一经查实,本站将立刻删除。