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

Posted

技术标签:

【中文标题】如何访问结构数组中的值?【英文标题】:How to access value in array of structs? 【发布时间】:2019-01-02 13:48:19 【问题描述】:

我在 Google Cloud 上使用 Spark 处理来自 Google Analytics 的数据,但我不知道如何根据索引选择自定义维度

GA 自定义维度的结构如下:

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

通常,在 BigQuery 中,我会做一个子查询来选择类似的数据

SELECT (select value from customDimensions where index = 2)

但正如here 中所述,select 中的子查询尚不支持。

【问题讨论】:

你试过使用UNSET吗? 【参考方案1】:

对 Google Cloud 上的 Spark 一无所知,但如果它与 Apache Spark 足够接近,则可以使用 element_at 函数,如果列是数组,后跟 dot 访问器,则返回给定索引值处的数组元素。

// 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|
+----------------------+

【讨论】:

以上是关于如何访问结构数组中的值?的主要内容,如果未能解决你的问题,请参考以下文章

了解如何在 lua 中访问表数组中的值

SQL(雅典娜)中的取消嵌套:如何将结构数组转换为从结构中提取的值数组?

如何创建从 MATLAB 中的结构中提取的值的字符串数组?

如何访问可选 NSSingleObjectArrayI 中的值?

访问/分配列表中结构中的值的问题 - C++

C语言中如何将结构体中的值赋给BYTE类型的缓存?