【发布时间】:2021-08-19 11:47:01
【问题描述】:
我有 10000 个具有不同 ID 的 json,每个都有 10000 个名称。如何通过使用 SQL Server 合并值来展平嵌套数组? Jsons 可以用任何语言阅读,我正在寻找任何可以在使用 spark 连接器时转换数据的 SQL 方言。我使用许多 SQL 方言,包括不限制 Spark SQL、Postgresql、MySql、SQLite 和 SQL Server...
注意:Martijn Pieters 要求我为每种 SQL 方言创建特定的副本,因此这是针对 SQL Server 的。
注意事项:
- 输入数据帧有超过 10000 个列 name_1_a、name_1000_xx 所以列(数组)名称不能硬编码,因为它需要写入 10000 个名称
-
id、date、val在所有列和所有 json 中始终具有相同的命名约定 - 数组大小可以变化,但
date、val始终存在,因此可以硬编码 -
date在每个数组中可以不同,例如 name_1_a 以 2001 开头,但 id == 1 的 name_10000_xvz 以 2000 开头,finnish 以 2004 开头,但是 id == 2 以 1990 开头并以 2004 结束
输入df:
root
|-- id: long (nullable = true)
|-- name_10000_xvz: array (nullable = true)
| |-- element: struct (containsNull = true)
| | |-- date: long (nullable = true)
| | |-- val: long (nullable = true)
|-- name_1_a: array (nullable = true)
| |-- element: struct (containsNull = true)
| | |-- date: long (nullable = true)
| | |-- val: long (nullable = true)
|-- name_1_b: array (nullable = true)
| |-- element: struct (containsNull = true)
| | |-- date: long (nullable = true)
| | |-- val: long (nullable = true)
|-- name_2_a: array (nullable = true)
| |-- element: struct (containsNull = true)
| | |-- date: long (nullable = true)
| | |-- val: long (nullable = true)
+---+------------------------------------------------------------------------+---------------------------------+---------------------------------+------------------------------------+
|id |name_10000_xvz |name_1_a |name_1_b |name_2_a |
+---+------------------------------------------------------------------------+---------------------------------+---------------------------------+------------------------------------+
|2 |[{1990, 39}, {2000, 30}, {2001, 31}, {2002, 32}, {2003, 33}, {2004, 34}]|[{2001, 1}, {2002, 2}, {2003, 3}]|[{2001, 4}, {2002, 5}, {2003, 6}]|[{2001, 21}, {2002, 22}, {2003, 23}]|
|1 |[{2000, 30}, {2001, 31}, {2002, 32}, {2003, 33}] |[{2001, 1}, {2002, 2}, {2003, 3}]|[{2001, 4}, {2002, 5}, {2003, 6}]|[{2001, 21}, {2002, 22}, {2003, 23}]|
+---+------------------------------------------------------------------------+---------------------------------+---------------------------------+------------------------------------+
所需的输出df:
+---+---------+----------+-----------+---------+----------------+
|id | date | name_1_a | name_1_b |name_2_a | name_10000_xvz |
+---+---------+----------+-----------+---------+----------------+
|1 | 2000 | 0 | 0 | 0 | 30 |
|1 | 2001 | 1 | 4 | 21 | 31 |
|1 | 2002 | 2 | 5 | 22 | 32 |
|1 | 2003 | 3 | 6 | 23 | 33 |
|2 | 1990 | 0 | 0 | 0 | 39 |
|2 | 2000 | 0 | 0 | 0 | 30 |
|2 | 2001 | 1 | 4 | 21 | 31 |
|2 | 2002 | 2 | 5 | 22 | 32 |
|2 | 2003 | 3 | 6 | 23 | 33 |
|2 | 2004 | 0 | 0 | 0 | 34 |
+---+---------+----------+-----------+---------+----------------+
以下是输入df的json:
1.json
{ "id": 1, "name_1_a": [ { "date": 2001, "val": 1 }, { "date": 2002, "val": 2 }, { "date": 2003, "val": 3 } ], "name_1_b": [ { "date": 2001, "val": 4 }, { "date": 2002, "val": 5 }, { "date": 2003, "val": 6 } ], "name_2_a": [ { "date": 2001, "val": 21 }, { "date": 2002, "val": 22 }, { "date": 2003, "val": 23 } ], "name_10000_xvz": [ { "date": 2000, "val": 30 }, { "date": 2001, "val": 31 }, { "date": 2002, "val": 32 }, { "date": 2003, "val": 33 } ]}
2.json
{ "id": 2, "name_1_a": [ { "date": 2001, "val": 1 }, { "date": 2002, "val": 2 }, { "date": 2003, "val": 3 } ], "name_1_b": [ { "date": 2001, "val": 4 }, { "date": 2002, "val": 5 }, { "date": 2003, "val": 6 } ], "name_2_a": [ { "date": 2001, "val": 21 }, { "date": 2002, "val": 22 }, { "date": 2003, "val": 23 } ], "name_10000_xvz": [ { "date": 1990, "val": 39 }, { "date": 2000, "val": 30 }, { "date": 2001, "val": 31 }, { "date": 2002, "val": 32 }, { "date": 2003, "val": 33 }, { "date": 2004, "val": 34 } ]}}
【问题讨论】:
-
你posted this earlier 怎么又发帖了?有一个edit 功能。
-
@Larnu,您引用的帖子已被删除,因为某些原因无法编辑,这是专门为您和 SQL Server 准备的。提前感谢您的帮助!!!
-
那么,如果我正确读取了您的示例数据,您需要动态列名吗?如果是这样,您将需要为此使用动态 SQL。还是您的列将始终为
name_1_a、name_1_b、name_2_a和name_10000_xvz? -
它们大约有 10000 个名称,但总是相同,因此我可以提前获取名称列表,并且可以通过循环这些名称来创建 SQL 字符串
-
那么动态SQL...这将是一团糟。
标签: sql sql-server