sql - 如何使用sql在数据 block 上创建带有嵌套 map 的表

标签 sql arrays apache-spark apache-spark-sql databricks

我正在尝试复制这个给定的模式:

+---------------+-----------------------------------------------------------------------+
| column        | type                                                                  |
+---------------+-----------------------------------------------------------------------+
| first_name    | STRING                                                                |
| last_name     | STRING                                                                |
| subscriptions | MAP<STRING, MAP <titles:ARRAY<STRING>, payment_methods:ARRAY<STRING>> |

用这个语句:

CREATE TABLE IF NOT EXISTS mydb.map1 (
  first_name STRING,
  last_name STRING,
  subscriptions MAP < MAP < STRING, ARRAY<STRING> >,  MAP < STRING, ARRAY<STRING> >> 
)

我设法编写了这个架构。但老实说,我不能 100% 确定它是否反射(reflect)了给定的模式。这部分让我很困惑:“MAP titles:ARRAY

+---------------+----------------------------------------------------------+ 
| col_name      | data_type                                                | 
+---------------+----------------------------------------------------------+
| first_name    | string                                                   | 
| last_name     | string                                                   | 
| subscriptions | map<map<string,array<string>>,map<string,array<string>>> |

# Partitioning
Not partitioned

所以我尝试用这个插入语句来测试它:

%sql
INSERT INTO
  mydb.map1
VALUES  
  ('String1', 'String2', Map( Map('titles', Array('S1', 'S2', 'S3')), Map('payment_methods', Array('S1', 'S2', 'S3'))))

但这只是给了我这个错误陈述,我被困在这里:

Error in SQL statement: AnalysisException: cannot resolve 'map(map('titles', array('S1', 'S2', 'S3')), map('payment_methods', array('S1', 'S2', 'S3')))' due to data type mismatch: The key of map cannot be/contain map.; line 9 pos 2;

我必须如何编写 CREATE 语句才能获得上面给定的模式?

最佳答案

坦率地说,您的创建表并不完全正确。我不明白subscriptions是怎么定义的领域 MAP<STRING, MAP <titles:ARRAY<STRING>, payment_methods:ARRAY<STRING>>可以在 map 中命名字段 - 根据定义, map 支持任意键,而不仅仅是特定键。

如果你想实现那个,那么最好使用 struct作为 map 的值(value),请尝试以下操作:

subscriptions MAP<STRING, STRUCT<titles:ARRAY<STRING>, payment_methods:ARRAY<STRING>>>

真正的问题是您声明了一个映射,其中键和值都是映射。如果你仍然想使用 map ,那么你需要声明如下:

subscriptions MAP<STRING, MAP<STRING, ARRAY<STRING>>>

关于sql - 如何使用sql在数据 block 上创建带有嵌套 map 的表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67027189/

相关文章:

mysql - 使用 SQL 参数保护我的应用程序免受注入(inject)攻击

java - ORA-00933 : SQL command not properly ended in a query that runs fine in SQL developer

c - 覆盖 C 数组中的空字符

javascript - 为什么在 JavaScript 中将对象插入另一个数组后,我的对象会变成数组?

c - 在 gcc 语句表达式中声明一个数组并返回指向它的指针?

java - 在 Spark 中将数据集应用为广播

sql - 在 SQL 中,是否有类似于 countif 语句的内容或将分组结果显示为列而不是行的方法?

mysql - 优化用于标记匹配的 SQL 查询

r - 找不到函数 "switch_lang"

scala - spark mllib 将函数应用于 rowMatrix 的所有元素