在AWS athena

时间:2017-09-06 15:33:15

标签: amazon-web-services amazon-s3 amazon-athena

您好目前我已在AWS Athena中创建了一个表架构,如下所示

CREATE EXTERNAL TABLE IF NOT EXISTS axlargetable.AEGIntJnlActivityLogStaging (
  `clientcomputername` string,
  `intjnltblrecid` bigint,
  `processingstate` string,
  `sessionid` int,
  `sessionlogindatetime` string,
  `sessionlogindatetimetzid` bigint,
  `recidoriginal` bigint,
  `modifieddatetime` string,
  `modifiedby` string,
  `createddatetime` string,
  `createdby` string,
  `dataareaid` string,
  `recversion` int,
  `partition` bigint,
  `recid` bigint 
)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
WITH SERDEPROPERTIES (
   'separatorChar' = ',',
   'quoteChar' = '\"',
   'escapeChar' = '\\'
   ) 
LOCATION 's3://ax-large-table/AEGIntJnlActivityLogStaging/'
TBLPROPERTIES ('has_encrypted_data'='false');

但其中一个提交(处理状态)值包含逗号“欧洲,中东和非洲”,它取代了列顺序。

那么读取此文件的最佳方法是什么。感谢

3 个答案:

答案 0 :(得分:0)

作为解决方法 - 查看aws glue项目。

而不是通过CREATE EXTERNAL TABLE创建表格:

  1. 为您的表格调用get-table
  2. 然后为create-table
  3. 制作json
  4. 合并以下StorageDescriptor部分:

    {    “StorageDescriptor”:{      “SerdeInfo”:{        “SerializationLibrary”:“org.apache.hadoop.hive.serde2.OpenCSVSerde”        ...      }    ...  }

  5. 通过aws cli执行创建。您将在aws glue中获得此表,并且athena能够选择正确的列。

  6. 备注

    1. 如果您的表已定义OpenCSVSerde - 可能会解决此问题,您可以简单地重新创建此表。
    2. 我对athena没有多少知识,但在aws glue中你可以删除或创建表而不会丢失任何数据
    3. 在通过create-table添加此表之前,您必须首先检查胶水或/和athena hadles表重复的方式

答案 1 :(得分:0)

当我删除此部分时

WITH SERDEPROPERTIES (
'separatorChar' = ',',
'quoteChar' = '\"',
'escapeChar' = '\\'
) 

我能够阅读引号中带有逗号的文字

答案 2 :(得分:0)

这是一种常见的混乱 CSV 文件情况,其中某些值包含逗号。 Athena 中的解决方案是使用 AWS doc https://docs.aws.amazon.com/athena/latest/ug/csv-serde.html 中所述的 SERDEPROPERTIES [url 可能会更改,因此只需搜索“OpenCSVSerDe for Processing”]

以下是提供的基本创建表示例。根据您的数据,您必须确保正确指定数据类型(例如字符串)

创建外部表 test1 ( f1 字符串, s2 字符串) 行格式 SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde' WITH SERDEPROPERTIES ("separatorChar" = ",", "escapeChar" = "\") LOCATION 's3://user-test-region/dataset/test1/'