我有一个SparkDataframe如下。它在zipped\u feature列中有array struct数组。
+--------------------+
|zipped_feature |
+--------------------+
|[[A, 1], [ABC, 33]] |
|[[A, 1], [ABS, 24]] |
|[[B, 2], [ABE, 17]] |
|[[C, 3], [ABC, 33]] |
+--------------------+
我尝试使用index在数组struct的这个数组上获取一个项(也是一个数组)。我试着在自定义项下获取基于索引的值。如果第一行的索引为0,则应检索“[a,1]”作为数组。
val getValueUdf = udf { (zippedFeature: Seq[Seq[String]], index: Int) => zippedFeature(index) }
但我的错误率越来越低
data type mismatch: argument 1 requires array<array<string>> type, however, '`zipped_feature`' is of array<struct<_1:string,_2:string>> type.
当我打印模式时,它显示如下
|-- zipped_feature: array (nullable = true)
| |-- element: struct (containsNull = true)
| | |-- _1: string (nullable = true)
| | |-- _2: string (nullable = true)
有人能帮我找出我做错了什么吗。我想得到基于索引的值(同样是数组)。
4条答案
按热度按时间roejwanj1#
zipped\u feature是array类型的列。如果要将每个嵌套列值作为一个数组获取,则需要修改udf,如下所示。
ugmeyewa2#
根据我的说法,这个用例不需要用户定义的函数。你可以很容易地使用
withColumn
以及select
完成任务的声明。输出1:
输出2:
输出3:
输出4:
tp5buhyn3#
从错误消息中,列
zipped_feature
是结构数组类型,而不是数组类型。不需要自定义项按索引访问数组元素,可以使用以下选项之一:要将结构数组转换为数组数组,可以使用
transform
功能:或者直接不变换数组:
hmtdttj44#
您可以尝试使用dataset api
map
方法: