如何正确导入tsv到雅典娜

时间:2018-05-30 15:12:27

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

我正在效仿这个例子:

LazySimpleSerDe for CSV, TSV, and Custom-Delimited Files - TSV example

代码摘要:

  const ClaimRow = ({claim}) =>  (     
      <tr>
        <td>{JSON.stringify(claim)}</td>
        <td>{claim.claimID}</td>
        <td>{claim.carrier}</td>
     </tr>

export default ClaimRow;

我的问题是:

  • 我的tsv没有列名

(我的tsv) enter image description here

如果我只将列列为c1,c2 ......并将所有列列为CREATE EXTERNAL TABLE flight_delays_tsv ( yr INT, quarter INT, month INT, ... div5longestgtime INT, div5wheelsoff STRING, div5tailnum STRING ) PARTITIONED BY (year STRING) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' ESCAPED BY '\\' LINES TERMINATED BY '\n' LOCATION 's3://athena-examples-myregion/flight/tsv/'; ,是否可以?

  • 我不明白这一点:

    分组(年份STRING)

在示例中,列'year'未在任何列中列出...

1 个答案:

答案 0 :(得分:0)

列名

列名由CREATE EXTERNAL TABLE命令定义。我建议你将它们命名为有用的东西,以便更容易编写查询。列名称不需要匹配实际文件中的任何名称。 (它不解释标题行。)

<强>分区

来自Partitioning Data - Amazon Athena

  

要创建包含分区的表,必须在CREATE TABLE语句中定义它。使用PARTITIONED BY定义用于对数据进行分区的键。

用于对数据进行分区的字段是 NOT 存储在文件本身中,这就是它们不在表定义中的原因。相反,列值存储在目录名称

这可能看起来很奇怪(将值存储在目录名中!)但实际上是有意义的,因为它避免了在文件夹中存储不正确值的情况。例如,如果有year=2018文件夹,如果文件包含年份为2017的列,会发生什么?通过在目录名中存储year可以避免这种情况,从而为该目录中的任何文件分配目录名中表示的值。

查询仍然可以使用WHERE year = 2018,即使它没有列为实际列。

另请参阅:LanguageManual DDL - Apache Hive - Apache Software Foundation

另一个简洁的事情是,只需将文件移动到另一个目录即可更新数据。在此示例中,它将更改year值,因为它位于不同的目录中。

是的,这很奇怪,但诀窍是不要像普通数据库一样思考它并欣赏它提供的自由。例如,附加新数据就像将文件放入目录一样简单。无需加载!