Apache spark pyspark更改数据捕获实现
我有一个基表,它保存着实际的数据。以下是表格结构 身份证件 名称 地址 年龄 日期 A1 {“fname”:“Alex”,“lname”:“Bhatt”} {“巷”:“麦克街”、“公寓”:[“24”、“26”、“27”、“29”]} 56 20201128 A2 {“fname”:“Bob”,“lname”:“Natarajan”} {“巷”:“罗伊德街”,“公寓”:[“22”、“23”、“27”],“宾”:“123514”} 53 20201123 A1 {“fname”:“Alex”,“lname”:“Bhattacharya”} {“巷”:“麦克街”、“公寓”:[“24”、“26”、“27”、“29”]} 56 20201228 A2 {“fname”:“Bob”,“lname”:“Natarajan”} {“巷”:“罗伊德街”,“公寓”:[“22”、“24”、“27”],“宾”:“123514”} 53 20201228Apache spark pyspark更改数据捕获实现,apache-spark,pyspark,apache-spark-sql,change-data-capture,Apache Spark,Pyspark,Apache Spark Sql,Change Data Capture,我有一个基表,它保存着实际的数据。以下是表格结构 身份证件 名称 地址 年龄 日期 A1 {“fname”:“Alex”,“lname”:“Bhatt”} {“巷”:“麦克街”、“公寓”:[“24”、“26”、“27”、“29”]} 56 20201128 A2 {“fname”:“Bob”,“lname”:“Natarajan”} {“巷”:“罗伊德街”,“公寓”:[“22”、“23”、“27”],“宾”:“123514”} 53 20201123 A1 {“fname”:“Alex”,“ln
我认为您需要创建另一个json列,以便使用
get\u json\u object
。。。见下面我的答案
import pyspark.sql.functions as F
result = df1.select(
'id',
'date',
F.to_json(
F.struct(
F.from_json('name', 'fname string, lname string').alias('name'),
F.from_json('address', 'lane string, flat array<string>, pin string').alias('address')
)
).alias('jsoncol')
).join(
df2.withColumnRenamed('date', 'date2'), 'id'
).withColumn(
'new_value',
F.expr("get_json_object(jsoncol, '$.' || changed_field)")
).groupBy('id', 'changed_field').agg(
F.array_sort(
F.collect_list(
F.array('date', 'new_value')
)
).alias('values')
).select(
'id',
'changed_field',
F.col('values')[1][1].alias('new_value'),
F.col('values')[1][0].alias('newdate'),
F.col('values')[0][1].alias('old_value'),
F.col('values')[0][0].alias('olddate')
)
我认为您需要创建另一个json列,以便使用
get\u json\u object
。。。见下面我的答案
import pyspark.sql.functions as F
result = df1.select(
'id',
'date',
F.to_json(
F.struct(
F.from_json('name', 'fname string, lname string').alias('name'),
F.from_json('address', 'lane string, flat array<string>, pin string').alias('address')
)
).alias('jsoncol')
).join(
df2.withColumnRenamed('date', 'date2'), 'id'
).withColumn(
'new_value',
F.expr("get_json_object(jsoncol, '$.' || changed_field)")
).groupBy('id', 'changed_field').agg(
F.array_sort(
F.collect_list(
F.array('date', 'new_value')
)
).alias('values')
).select(
'id',
'changed_field',
F.col('values')[1][1].alias('new_value'),
F.col('values')[1][0].alias('newdate'),
F.col('values')[0][1].alias('old_value'),
F.col('values')[0][0].alias('olddate')
)
名称和地址列的数据类型是什么?StringType或StructType?名称和地址列的数据类型是什么?StringType还是StructType?