Abh*_*ava 3 amazon-web-services amazon-athena
这是输入数据文件中的示例行,具有两个字段 - 部门和名称
dept,names
Mathematics,[foo,bar,alice,bob]
Run Code Online (Sandbox Code Playgroud)
这里,“name”是一个字符串数组,我想将其加载为字符串 Athena 数组。
有什么建议吗?
要获得有效的 CSV 文件,请确保在数组周围添加引号:
Mathematics,"[foo,bar,alice,bob]"
Run Code Online (Sandbox Code Playgroud)
如果您可以删除“[”和“]”,下面的解决方案将变得更加容易,您可以在没有正则表达式的情况下进行拆分。
Better: Mathematics,"foo,bar,alice,bob"
Run Code Online (Sandbox Code Playgroud)
首先从 CSV 创建一个仅包含字符串的简单表:
CREATE EXTERNAL TABLE IF NOT EXISTS test.mydataset (
`dept` string,
`names` string
)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
WITH SERDEPROPERTIES (
'serialization.format' = ',',
'field.delim' = ',',
'quoteChar' = '"',
"separatorChar" = ',',
'collection.delim' = ',',
'mapkey.delim' = ':'
) LOCATION 's3://<your location>'
TBLPROPERTIES ('has_encrypted_data'='false')
Run Code Online (Sandbox Code Playgroud)
然后创建一个视图,使用正则表达式删除“[”和“]”字符,然后用“,”将其余字符拆分为一个数组。
CREATE OR REPLACE VIEW mydataview AS
SELECT dept,
split(regexp_extract(names, '^\[(.*)\]$', 1), ',') as names
FROM mydataset
Run Code Online (Sandbox Code Playgroud)
然后使用该视图进行查询。我不是 100% 确定,因为我只花了 12 个小时使用 Athena。
--
请注意,为了使用引号,您需要使用 OpenCSVSerde,“lazyserde”将无法工作,因为它支持引号。lazyserde 确实支持内部数组,但在这种情况下不能使用“,”作为分隔符。如果您想尝试一下,您的数据将如下所示:
Better: Mathematics,foo|bar|alice|bob
Run Code Online (Sandbox Code Playgroud)
在这种情况下,这可能会直接起作用:
CREATE EXTERNAL TABLE IF NOT EXISTS test.mydataset (
`dept` string,
`names` array<string>
)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
WITH SERDEPROPERTIES (
'serialization.format' = ',',
'field.delim' = ',',
'quoteChar' = '"',
"separatorChar" = ',',
'collection.delim' = '|',
'mapkey.delim' = ':'
) LOCATION 's3://<your location>'
TBLPROPERTIES ('has_encrypted_data'='false')
Run Code Online (Sandbox Code Playgroud)
请注意 collection.delim = '|',它应该将您的字段直接转换为数组。
抱歉,我没有时间对此进行测试,如果您可以确认什么有效,我将很乐意更新我的答案。希望这能让你开始。
| 归档时间: |
|
| 查看次数: |
2038 次 |
| 最近记录: |