如何使用 sql 在数据块上使用嵌套地图创建 table
How to create table with nested map on databricks using sql
我正在尝试复制这个给定的架构:
+---------------+-----------------------------------------------------------------------+
| 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% 确定它是否反映了给定的模式。这部分让我很困惑:“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 语句才能获得上面给定的架构?
坦率地说,您的创建 table 并不完全正确。我不明白 subscriptions
字段 MAP<STRING, MAP <titles:ARRAY<STRING>, payment_methods:ARRAY<STRING>>
的定义如何在地图中命名字段 - 根据定义,地图支持任意键,而不仅仅是特定键。
如果你想实现那个,那么最好使用 struct
作为地图的价值,尝试以下:
subscriptions MAP<STRING, STRUCT<titles:ARRAY<STRING>, payment_methods:ARRAY<STRING>>>
真正的问题是您声明了一个映射,其中键和值都是映射。如果你仍然想使用地图,那么你需要声明如下:
subscriptions MAP<STRING, MAP<STRING, ARRAY<STRING>>>
我正在尝试复制这个给定的架构:
+---------------+-----------------------------------------------------------------------+
| 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% 确定它是否反映了给定的模式。这部分让我很困惑:“MAP titles:ARRAY 所以我尝试用这个插入语句来测试它: 但这只是给我这个错误陈述,我被困在这里: 我必须如何编写 CREATE 语句才能获得上面给定的架构?+---------------+----------------------------------------------------------+
| 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;
坦率地说,您的创建 table 并不完全正确。我不明白 subscriptions
字段 MAP<STRING, MAP <titles:ARRAY<STRING>, payment_methods:ARRAY<STRING>>
的定义如何在地图中命名字段 - 根据定义,地图支持任意键,而不仅仅是特定键。
如果你想实现那个,那么最好使用 struct
作为地图的价值,尝试以下:
subscriptions MAP<STRING, STRUCT<titles:ARRAY<STRING>, payment_methods:ARRAY<STRING>>>
真正的问题是您声明了一个映射,其中键和值都是映射。如果你仍然想使用地图,那么你需要声明如下:
subscriptions MAP<STRING, MAP<STRING, ARRAY<STRING>>>