Apache spark 如何访问结构数组中的值?

Apache spark 如何访问结构数组中的值?,apache-spark,apache-spark-sql,google-bigquery,Apache Spark,Apache Spark Sql,Google Bigquery,我正在使用谷歌云上的Spark来处理来自谷歌分析的数据,但我不知道如何根据索引选择自定义维度 GA自定义维度的结构为: ARRAY<STRUCT< index: INTEGER, value:STRING >> 但正如select中的子查询中所解释的,它还不受支持 对Google Cloud上的Spark一无所知,但如果它与Apache Spark足够接近,则可以使用函数在给定索引处返回数组元素的值,前提是列后跟dotaccessor // create a sampl

我正在使用谷歌云上的Spark来处理来自谷歌分析的数据,但我不知道如何根据索引选择自定义维度

GA自定义维度的结构为:

ARRAY<STRUCT< index: INTEGER, value:STRING >>

但正如select中的子查询中所解释的,它还不受支持

对Google Cloud上的Spark一无所知,但如果它与Apache Spark足够接近,则可以使用函数在给定索引处返回数组元素的值,前提是列后跟
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")
由于
索引
未知,以下查询将不起作用

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\u

scala> sql("select element_at(a, 2) from customDimensions").show
+----------------+
|element_at(a, 2)|
+----------------+
|        [1, one]|
+----------------+
“数组”是一个结构,因此可以使用
(点)


你试过使用UNSET吗?
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|
+----------------------+