我正在效仿这个例子:
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;
我的问题是:
如果我只将列列为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'未在任何列中列出...
答案 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
值,因为它位于不同的目录中。
是的,这很奇怪,但诀窍是不要像普通数据库一样思考它并欣赏它提供的自由。例如,附加新数据就像将文件放入目录一样简单。无需加载!