我有一个包含多个列的数据集,这些列是StructType的数组。我的最终目标是从每个字段中删除一个或多个字段,而其他方式则保留数据集的结构。下面的示例仅显示一个这样的列来简化问题。
从不使用元素值val的xml中读取原始数据,导致每个结构中的_VALUE字段为空。最简单的开始用例是 我想在示例中删除_VALUE字段。
简化模式为:
root
|-- Option
| |-- element: struct (containsNull = true)
| | |-- _VALUE: string (nullable = true)
| | |-- _codeName: string (nullable = true)
| | |-- _optionName: string (nullable = true)
| | |-- _optionType: string (nullable = true)
选项列的select.show显示如下:
[[, option_A, Option A, type_1], [, option_B, Option B, type_1], [, option_C, Option C, type_2]]
[[, option_A, Option A, type_1], [, option_B, Option B, type_1], [, option_C, Option C, type_2]]
[[, option_E, Option E, type_2], [, option_C, Option C, type_2], [, option_B, Option B, type_1], [, option_A, Option A, type_1], [, option_D, Option D, type_3]]
[[, option_C, Option C, type_2], [, option_B, Option B, type_1], [, option_A, Option A, type_1]]
我发现Dropping a nested column from Spark DataFrame试图删除嵌套的_VALUE列。从@LiorChaga提供的Java解决方案开始,我在@ user3794759上方的scala解决方案中添加了数组逻辑。这确实删除了所需的列,但是表达式的性质将每个内部字段收集到横跨整个数组的自己的数组中(即,将“结构数组”更改为“带有数组的单个结构”:
[[option_A, option_B, option_C], [Option A, Option B, Option C], [type_1, type_1, type_2]]
[[option_A, option_B, option_C], [Option A, Option B, Option C], [type_1, type_1, type_2]]
[[option_E, option_C, option_B, option_A, option_D], [Option E, Option C, Option B, Option A, Option D], [type_2, type_2, type_1, type_1, type_3]]
[[option_C, option_B, option_A], [Option C, Option B, Option A], [type_2, type_1, type_1]]
该逻辑似乎可以处理简单类型的数组,但不能处理嵌套结构。我已经尝试过对构造的列表达式进行各种修改,但是由于该语句本质上是一个选择,因此按名称提及字段会将它们收集在一起。我什至使用了scala解决方案,结果是相同的。
与Option最接近的结果列表达式为:
array(named_struct(NamePlaceholder(),Option ['_ codeName'] AS _codeName
,NamePlaceholder(),Option ['_ optionName'] AS _optionName
,NamePlaceholder(),Option ['_ optionType'] AS { {1}}))
试图区分内部列不起作用。也许有一种结构化的方法,那就是在每个结构实例中指定我想要的字段,而不是创建一个已收集具有每个字段值的数组的单个结构,但我无法弄清楚。
概述:当该结构位于任意大小的数组列中时,是否有办法在该结构内删除字段?似乎试图从所引用的问题中调出解决方案是行不通的,因为它总是会导致按名称“选择”剩余字段,这将按字段对它们进行分组,而不是将其按原始字段进行分组结构实例。
或者:是否可以直接操纵模式?还是从具有新架构的原始数据集中创建新的数据集,该数据集会自动映射所需的列,同时保留已删除的列?
1)理想情况下,我想将解决方案保留在Java中以匹配其余代码库,但是如果Java不可行,则可以使用scala。 2)我在寻找通用/动态解决方案。我需要对多个复杂列中的多个字段执行此操作,而不希望不在语句中按名称手动指定列。 3)我需要按名称删除字段。并非总是因为它们为null。无论内容如何,都会删除其中一些。 4)由于我必须对多个列执行此操作,因此我希望使用不涉及爆炸每个数组列的解决方案,因为这样最终会为每个初始行创建数十行。 5)我对Spark还是很陌生,所以可能有一些明显的解决方案,但我只是不知道自己查找的概念或术语。随意过度解释。
感谢您的任何建议或帮助。