new_DF=old_DF\
.select(col("id"),
col("COL1"),
col("COL2"),
).distinct()
new_JSON_DF = new_DF\
.withColumn("PROP",struct(col("COL1"),col("COL2")))\
.drop("COL1", "COL2")
Кол1, столбец 2 могут иметь нули.
Если данные выглядят следующим образом:
id COL1 COL2
1 null def
2 abc null
3 null null
Я хочу, чтобы результат в новом JSON DF был таким:
{
id : 1
PROP : {
"COL2" : "def"
}
},
{
id : 2
PROP : {
"COL1" : "abc"
}
},
{
id : 3
PROP : {}
}
Вышеупомянутый фрейм данных является фреймом данных Spark, и я пытался его использовать
new_JSON_DF = new_JSON_DF.withColumn("PROP", map_filter("PROP", lambda k, v: v.isNotNull()))
Это не работает, и я также пробовал использовать pandas, и следующая команда работает, но поскольку функция toPandas имеет ограничение на память, она выдает ошибку памяти.pandas_df = new_JSON_DF.toPandas()
pandas_df['PROP'] = pandas_res_df['PROP'].apply(lambda x: {k: v for k, v in x.items() if v is not None})
schema = StructType([
StructField("id", StringType(), True),
StructField("PROP", MapType(StringType(), StringType()), True)
])
new_JSON_DF = spark.createDataFrame(pandas_df, schema=schema)
Подробнее здесь: https://stackoverflow.com/questions/787 ... ing-pandas