

[巨大な CSV から Athena
で読めるカラムナー形式に変換したい](https://ja.stackoverflow.com/questions/77430/%E5%B7%A8%E5%A4%A7%E3%81%AA-
csv-%E3%81%8B%E3%82%89-athena-%E3%81%A7%E8%AA%AD%E3%82%81%E3%82%8B%E3%82%AB%E3%83%A9%E3%83%A0%E3%83%8A%E3%83%BC%E5%BD%A2%E5%BC%8F%E3%81%AB%E5%A4%89%E6%8F%9B%E3%81%97%E3%81%9F%E3%81%84)  
こちらの質問で  
<https://orc.apache.org/docs/cpp-tools.html#csv-import>  
このツールを教えていただいたのですがスキーマの与え方がわかりません

* * *
[code]

    [駅],b'\x00\x00\x00\x00\x01\x01\x00\x00\x00\x00\x00\x00@\x84{a@\x00\x00\x00@\x12\xd5A@'
    
[/code]

という１行だけのCSVを変換しようとしたところ以下のようなエラーになります

[code]

    csv-import "struct<tags:array<string>,geom:binary>" test.csv test.orc
    [2022-02-07 22:17:14] Start importing Orc file...
    libc++abi.dylib: terminating with uncaught exception of type std::runtime_error: array<string> is not supported yet.
    zsh: abort      csv-import "struct<tags:array<string>,geometry:binary>" test.csv test.orc
    
[/code]

<https://orc.apache.org/docs/types.html>  
これを見ると array という記述が存在しないせいみたいなんですが

最終的に以下のような Athena のテーブルでアクセスしたいのですが  
Athena 上の array 型になる orc を作るにはどういうスキーマを記述すればいいのでしょうか

[code]

    CREATE EXTERNAL TABLE `test`(
      `tags` array<string>, 
      `geometry` binary)
    ROW FORMAT SERDE 
      'org.apache.hadoop.hive.ql.io.orc.OrcSerde' 
    WITH SERDEPROPERTIES ( 
      'orc.column.index.access'='false') 
    STORED AS INPUTFORMAT 
      'org.apache.hadoop.hive.ql.io.orc.OrcInputFormat' 
    OUTPUTFORMAT 
      'org.apache.hadoop.hive.ql.io.orc.OrcOutputFormat'
    LOCATION
      's3://xxxxx'
    TBLPROPERTIES (
      'has_encrypted_data'='false', 
      'orc.column.index.access'='false', 
      'transient_lastDdlTime'='1560415678')
    
[/code]

* * *

list を与えてもダメでした

[code]

    csv-import "struct<tags:list<string>,geom:binary>" test.csv test.orc
    [2022-02-08 16:39:42] Start importing Orc file...
    libc++abi.dylib: terminating with uncaught exception of type std::logic_error: Unknown type list
    zsh: abort      csv-import "struct<tags:list<string>,geom:binary>" test.csv test.orc
    
[/code]

array 自体はキーワードとして認識されるようです

[code]

    csv-import "struct<tags:array,geom:binary>" test.csv test.orc
    [2022-02-08 17:49:53] Start importing Orc file...
    libc++abi.dylib: terminating with uncaught exception of type std::logic_error: Array type must contain exactly one sub type.
    zsh: abort      csv-import "struct<tags:array,geom:binary>" test.csv test.orc
    
[/code]

そもそもCSV側もの与え方も [駅] みたいな書き方でいいのかよくわからないし  
Athena コンソール上で array カラムを表示すると [abc, xyz] みたいにでてくるので  
試しに [] でくくってみました

<https://orc.apache.org/docs/cpp-tools.html#csv-import>  
このすぐ上の orc-metadata のところには

[code]

    "struct<boolean1:boolean,byte1:tinyint,short1:smallint,
    int1:int,long1:bigint,float1:float,double1:double,bytes1:binary,
    string1:string,middle:struct<list:array<struct<int1:int,string1:
    string>>>,list:array<struct<int1:int,string1:string>>,map:map<
    string,struct<int1:int,string1:string>>>"
    
[/code]

のような書き方がされてるので array や list でいけるかと思いましたが...

ドキュメントもみあたらず man もないし -h にも説明が出てこないので大人しく pyorc あたり使ってプログラム書くことにします


CC BY-SA 4.0
2022-02-07T13:33:56.307
86188
2022-02-08T08:51:27.907
2022-02-08T08:51:27.907
question
aws-athena
CSV からAWS Athena array 型のカラムを持つ orc 形式に変換したい


手元で試していないのですが、ORC で言うところの `list` 型を使えば Athena で言うところの `array` 型に SerDe
のタイミングで変換できそうです。


CC BY-SA 4.0
2022-02-07T14:31:16.553
86190
2022-02-07T14:31:16.553
19110
86188
answer