我可以在SparkSQL中执行以下语句:
result_df = spark.sql("""select
one_field,
field_with_struct
from purchases""")
结果 Dataframe 的字段将具有field_with_struct
中的完整结构。
| 一个字段|带结构的字段|
| - ------|- ------|
| 一百二十三|{名称1,值1,值2,f2,f4}|
| 五百五十五|{名称2、值3、值4、f6、f7}|
我只想从field_with_struct
中选择几个字段,但在结果 Dataframe 中仍将它们保留在struct中。如果可能的话(这不是真正的代码):
result_df = spark.sql("""select
one_field,
struct(
field_with_struct.name,
field_with_struct.value2
) as my_subset
from purchases""")
要得到这个:
| 一个字段|我的子集|
| - ------|- ------|
| 一百二十三|{名称1,值2}|
| 五百五十五|{名称2,值4}|
有没有办法用SQL来实现这一点?(不能用Fluent API)
2条答案
按热度按时间waxmsbnn1#
有一个使用arrays_zip的简单得多的解决方案,不需要explode/collect_list(对于复杂数据,这可能容易出错/很困难,因为它依赖于使用类似id列的东西):
EDIT添加相应的Spark SQL代码,因为这是OP要求的:
fcy6dtqo2#
事实上,我提供的伪代码是有效的。对于对象的嵌套数组来说,这不是那么简单。首先,数组应该被分解(EXPLODE()函数),然后选择一个子集。之后,就可以创建一个COLLECT_LIST()。
这将只从Items中的结构中选择两个字段,并最终返回一个数据集,该数据集再次包含一个具有Items的数组。