Ничего не знаете о Spark в Google Cloud, но если он достаточно близок к Apache Spark, вы можете использовать функцию element_at , которая возвращает элемент массива по указанному индексу в значении, если столбец является массивом, за которым следует dot
accessor.
// create a sample dataset
val structData = Seq((0,"zero"), (1, "one")).toDF("id", "value")
val data = structData
.select(struct("id", "value") as "s")
.groupBy()
.agg(collect_list("s") as "a")
// the schema matches the requirements
scala> data.printSchema
root
|-- a: array (nullable = true)
| |-- element: struct (containsNull = true)
| | |-- id: integer (nullable = false)
| | |-- value: string (nullable = true)
data.createOrReplaceTempView("customDimensions")
Следующий запрос не будет работать, поскольку index
неизвестен.
scala> sql("select value from customDimensions where index = 2").show
org.apache.spark.sql.AnalysisException: cannot resolve '`index`' given input columns: [customdimensions.a]; line 1 pos 41;
'Project ['value]
+- 'Filter ('index = 2)
+- SubqueryAlias `customdimensions`
+- Aggregate [collect_list(s#9, 0, 0) AS a#13]
+- Project [named_struct(id, id#5, value, value#6) AS s#9]
+- Project [_1#2 AS id#5, _2#3 AS value#6]
+- LocalRelation [_1#2, _2#3]
...
Давайте вместо этого используем стандартную функцию element_at
.
scala> sql("select element_at(a, 2) from customDimensions").show
+----------------+
|element_at(a, 2)|
+----------------+
| [1, one]|
+----------------+
«Массив» является структурой, поэтому вы можете использовать .
(точка).
scala> sql("select element_at(a, 2).value from customDimensions").show
+----------------------+
|element_at(a, 2).value|
+----------------------+
| one|
+----------------------+