是否可以在AWS Athena CSV文件中设置标头?

s4n0splo  于 2023-04-18  发布在  其他
关注(0)|答案(2)|浏览(113)

我有一个AWS Athena服务。查询后Athena生成一个CSV文件。假设我想在excel或google工作表中打开该CSV时看到以下结果(带标题)。

对于第7行到第13行是可以的。这是雅典娜的实际结果。我想添加一个标题(如图)。
我该怎么做?

qcuzuvrc

qcuzuvrc1#

这是不可能的,因为Athena不支持它,而且它也不兼容CSV格式。如果你想添加“头文件”,你可以使用“union all”,但它不会给予你预期的结果。
关于CSV格式:
https://en.wikipedia.org/wiki/Comma-separated_values

hlswsv35

hlswsv352#

即使它是一些肮脏的东西,我已经看到它的使用这些头文件,以避免值重复。我将使用我自己的样本文件在这里,你可以修改它:
| 颜色0|列1|col2|col3|col4|
| --------------|--------------|--------------|--------------|--------------|
| 客户|约翰·史密斯|--|--|--|
| 订单ID|订单_212345|--|--|--|
| 日期|2012年10月5日|--|--|--|
| 通货|欧元|--|--|--|
| 产品ID|产品名称|价格|单位|金额|
| PID_1234|糖|一点二|公斤|十二点|
| 产品识别码_2345|法里纳|2.10|公斤|20点|
| PID_3455|蛋|一点零五分|单位|两百|
| PID_3555|亲爱的|三点八五|升|三点|
前四行是 dirty header,它们应该代表所有其余行重复的数据。结果如下:
| 客户|订单ID|日期|通货|产品ID|产品名称|价格|单位|金额|
| --------------|--------------|--------------|--------------|--------------|--------------|--------------|--------------|--------------|
| 约翰·史密斯|订单_212345|2012年10月5日|欧元|PID_1234|糖|一点二|公斤|十二点|
| 约翰·史密斯|订单_212345|2012年10月5日|欧元|产品识别码_2345|法里纳|2.10|公斤|20点|
| 约翰·史密斯|订单_212345|2012年10月5日|欧元|PID_3455|蛋|一点零五分|单位|两百|
| 约翰·史密斯|订单_212345|2012年10月5日|欧元|PID_3555|亲爱的|三点八五|升|三点|
一个可能的查询是:

WITH
  RAW_DATA AS (
   SELECT
     col0, col1, col2, col3, col4,
     , "$path" file
     , row_number() over () as row_num
   FROM
     "database"."orders"
),
HEADER_ROWS AS (
   SELECT
     col0 key
   , col1 value
   , file
   FROM
     "database"."orders"
   WHERE row_num between 1 and 4
) 
, DATA_ROWS AS (
   SELECT
     col0 product_id
   , col1 product_name
   , col2 price
   , col3 unit
   , col4 amount
   , file
   FROM
     "database"."orders"
   WHERE (NOT (row_num between 1 and 5))
) 
, HEADER AS (
   SELECT
     file
   , "map_agg"(key, value) header
   FROM
     HEADER_ROWS
   GROUP BY file
) 
, ALL_DATA AS (
   SELECT
   , header['customer'] customer
   , header['order_id'] order_id
   , header['date'] date
   , header['currency'] currency
   , data_row.product_id
   , data_row.product_name
   , data_row.price
   , data_row.unit
   , data_row.amount
   FROM
     (HEADER
   INNER JOIN DATA_ROWS data_row ON (HEADER.file = data_row.FILE))
)
SELECT * FROM ALL_DATA

如果你只想跳过头文件:

SELECT
     *, row_number() over () as row_num
   FROM
     "mytable"
   WHERE NOT (row_num between 1 and 7)

相关问题