【问题标题】:Pyspark add new record to each Row [duplicate]Pyspark向每一行添加新记录[重复]
【发布时间】:2020-08-18 10:10:52
【问题描述】:
我使用的是 Spark 2.3.1。我正在从 json 文件中读取数据,并且有五个 类型的记录
行(age=24,payloadId=1,salary=2900)
我想在所有五个记录中添加一个新值,新值是这样的字典格式
{'age_condition':True,'salary_condition':True}
所以,现在 new Row 应该是这样的
行(age=24,payloadId=1,salary=2900,Result={'age_condition':True,'salary_condition':True})
【问题讨论】:
标签:
apache-spark
pyspark
apache-spark-sql
apache-spark-dataset
【解决方案1】:
这样怎么样?请注意,Result 列被视为字符串类型而不是字典。
import pyspark.sql.functions as f
from pyspark.sql.types import Row
row_list = [Row(age=24, payloadId=1, salary=2900)]
row_add = {'age_condition':True,'salary_condition':True}
spark.createDataFrame(row_list) \
.withColumn('Result', f.lit(str(row_add))) \
.collect()
[Row(age=24, payloadId=1, salary=2900, Result="{'age_condition': True, 'salary_condition': True}")]
【解决方案2】:
我不知道你为什么要通过在数据框列中添加字典来使事情复杂化,你应该添加两个新的布尔类型的列 age_condition 和 salary_condition。
这应该做你想做的......
from pyspark.sql.types import *
schema = StructType([StructField("dict", StructType([StructField("age_condition", BooleanType(), True), StructField("salary_condition", BooleanType(), True)]), True)])
newDf = spark.createDataFrame([{'age_condition':True,'salary_condition':True}], schema=schema)
df = spark.read.json("/whatever/json/path")
df.crossJoin(newDf) #no of records is same as in df as no of records in newDf is 1