我有一个列,它是一个任意长度的键/值结构数组:
StructType([
StructField("key", StringType(), False),
StructType([
StructField("string_value", StringType(), True),
StructField("int_value", IntegerType(), True),
StructField("float_value", FloatType(), True),
StructField("double_value", DoubleType(), True)
])
])
字符串
我知道只有几个不同的键名和它们的数据类型。例如,name总是一个字符串,birth_year总是一个整数,等等。不是每个属性都总是存在的,所以预定义的结构必须有所有可空的值,例如:
StructType([
StructField("first_name", StringType(), True),
StructField("middle_name", StringType(), True),
StructField("last_name", StringType(), True),
StructField("birth_year", IntegerType(), True),
StructField("ssn", IntegerType(), True),
StructField("zipcode", IntegerType(), True),
])
型
我的传入列看起来像这样:
[
(key: "first_name", value: (string_type: "John")),
(key: "ssn", value: (int_type: 123456789)),
(key: "last_name", value: (string_type: "Doe")),
]
------------------------------------------------------
[
(key: "ssn", value: (int_type: 987654321)),
(key: "last_name", value: (string_type: "Jones")),
]
------------------------------------------------------
[
(key: "zipcode", value: (int_type: 13579)),
(key: "first_name", value: (string_type: "Bob")),
(key: "birth_year", value: (int_type: 1985)),
(key: "last_name", value: (string_type: "Smith")),
]
型
我想让它们成为person结构的一列,像这样:
{
first_name: "John",
last_name: "Doe",
ssn: 123456789
}
------------------------------------------------------
{
last_name: "Jones",
ssn: 987654321
}
------------------------------------------------------
{
first_name: "Bob",
last_name: "Smith",
birth_year: 1985,
zipcode: 13579
}
型
这是一个操场示例,但真实的数据将有几十亿行,因此性能很重要,它不应该使用Python UDF,而应该只使用来自pyspark.sql.functions
的东西。
1条答案
按热度按时间7eumitmz1#
对于想要的结构体的每个元素,filter可以用来从数组中提取期望值:
字符串
测试结果:
型