我有一个这样格式的表格:
| 名称|水果|苹果|香蕉|橙子|
| --|--|--|--|--|
| 爱丽丝|[“苹果”、“香蕉”、“橙子”]| 5 | 8 | 3 |
| 鲍勃|[“苹果”]| 2 | 9 | 1 |
我想创建一个新列,其中包含以下格式的JSON包,其中键是数组的元素,值是列名称的结果值:
| 名称|水果|苹果|香蕉|橙子|新科尔|
| --|--|--|--|--|--|
| 爱丽丝|[“苹果”、“香蕉”、“橙子”]| 5 | 8 | 3 |{“苹果”:5,“香蕉”:8,“橙子”:3}|
| 鲍勃|[“苹果”]| 2 | 9 | 1 |{“apple”:2}|
我假设有一个UDF,但是我不能得到正确的语法。
这是我对代码的理解:
from pyspark.sql.functions import udf, col
from pyspark.sql.types import MapType, StringType
# Create a Spark session
spark = SparkSession.builder.appName("example").getOrCreate()
# Sample data
data = [("Alice", ["apple", "banana", "orange"], 5, 8, 3),
("Bob", ["apple"], 2, 9, 1)]
# Define the schema
schema = ["name", "fruits", "apple", "banana", "orange"]
# Create a DataFrame
df = spark.createDataFrame(data, schema=schema)
# Show the initial DataFrame
print("Initial DataFrame:")
display(df)
# Define a UDF to create a dictionary
@udf(MapType(StringType(), StringType()))
def json_map(fruits):
result = {}
for i in fruits:
result[i] = col(i)
return result
# Apply the UDF to the 'fruits' column
new_df = df.withColumn('test', json_map(col('fruits')))
# Display the updated DataFrame
display(new_df)
字符串
1条答案
按热度按时间qyuhtwio1#
你可以使用Abdennacer在他的回答中分享的
arrays_zip
方法,但前提是数组元素应该与你的列对齐,这可能并不总是如此。另一种方法是为列创建Map数组,并过滤该数组以仅保留
fruits
数组中可用的键的键值对。这里有一个例子
字符串
第一个
fruitcols_arr
创建一个Map数组(column_name -> column_value
)使用每个单独的fruit列.第二个过滤器基于fruits
列数组元素的数组.这是基于每个fruits
元素的Map的最终数组.new_col
是通过使用aggregate
高阶函数与map_concat
创建的,连接最终Map数组中的所有单个Map。