Как получить доступ к значению в массиве структур? - PullRequest
0 голосов
/ 02 января 2019

Я использую Spark в Google Cloud для обработки данных из Google Analytics, но я не знаю, как выбрать пользовательские измерения на основе индекса

Структура пользовательского измерения GA является следующей:

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

Обычно в BigQuery я выполняю подзапрос для выбора данных, таких как

SELECT (select value from customDimensions where index = 2)

Но, как объяснено в здесь, подзапрос в select пока не поддерживается.

1 Ответ

0 голосов
/ 03 января 2019

Ничего не знаете о 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|
+----------------------+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...