77657
最終的にやりたいのはタイトル通りです

普通は Athena 上で create 文を叩くと  
カラムナーフォーマットのデータをS3に生成してくれるんですが  
いまは元データがローカルにある状態です

サイズが 20GB ほどあるので  
これを Athena にインポートしてしまうと  
スキャンコストでかなり金額がかかってしまいます

なので Athena を使わずにカラムナー形式のファイルをローカルで生成して  
S3 において Athena で認識させたいです

node.js に orc を出力できるライブラリがあったので使ってみようと思ったところです

* * *

<https://github.com/corymickelson/norc>  
この node モジュールを動かしたいのですがどうやって使うのでしょうか

javascript はブラウザで動かすものばかりで node で動かしたことがあまりないので  
ピント外れなことかいていたらすみません

```

    npm install norc
    
    added 1 package, and audited 7 packages in 2s
    
    found 0 vulnerabilities
    
```

でモジュール自体はインストールできたんだと思うんですが

test.js

```

    import {norc, DataType} from '@npilots/norc'
    import {fromPath} from 'fast-csv'
    function convert(csv:string, output:string): void {
        const writer = new norc.Writer(output)
        const schema = {x: DataType.SMALLINT, y: DataType.SMALLINT}
        writer.schema(schema)
        fromPath(csv,{ headers: true })
            .on('data', chunk => {
                writer.add({x: chunk.x, y: chunk.y})
            })
            .on('end', () => {
                writer.close()
                // do something with .orc file
            })
    }
    
```

と１つめのサンプルコードをはりつけて実行してみたのですが

```

    # node test
    
    import {norc, DataType} from '@npilots/norc'
    ^^^^^^
    
    SyntaxError: Cannot use import statement outside a module
    
```

となってしまいます

* * *

JS やこのモジュールにこだわってるわけではないので  
他の言語でもコマンドでも何でもいいので  
サイズの小さい Athena で検索できる形に変換する方法があれば知りたいです

サイズが巨大なのでそれなりにパフォーマンスの出る方法だとうれしいです
CC BY-SA 4.0
2021-06-09T09:53:48.070
77430
2021-06-19T14:13:00.913
2021-06-09T16:44:30.203
3060
question
javascript node.js aws-athena
巨大な CSV から Athena で読めるカラムナー形式に変換したい
20 GB 程度であればそのまま Athena の CTAS で変換するのが個人的には便利です。料金もそこまでかからないと思うからです
<https://aws.amazon.com/jp/athena/pricing/>

よりファイルサイズが大きい場合には、ファイル出力時に最初からカラムナ形式にするのがベターでしょう。今回のように CSV
ファイルしか与えられていない場合であれば、以下のように変換することもできます。

## CSV -> ORC

CSV 形式のファイルから ORC 形式のファイルに変換したい場合、Apach ORC 公式から提供されているツール群の中に csv-import
という名前そのままの CLI ツールが提供されています。

<https://orc.apache.org/docs/cpp-tools.html#csv-import>

```

    $ csv-import --help
    Usage: csv-import [-h] [--help]
                      [-d <character>] [--delimiter=<character>]
                      [-s <size>] [--stripe=<size>]
                      [-c <size>] [--block=<size>]
                      [-b <size>] [--batch=<size>]
                      <schema> <input> <output>
    Import CSV file into an Orc file using the specified schema.
    Compound types are not yet supported.
    
```

## CSV -> Parquet

CSV 形式から Parquet 形式にする方法はいくつか知られています。たとえば Apache Arrow の Python ライブラリである
[pyarrow](https://pypi.org/project/pyarrow/) を使う方法があります。おおまかには以下の流れです。

  1. `pyarrow.csv.read_csv` を使って CSV を `pyarrow.Table` のインスタンスとして読み込み <https://arrow.apache.org/docs/python/csv.html>
  2. `pyarrow.parquet.write_table` を使って `pyarrow.Table` のインスタンスを Parquet 形式で書きだす <https://arrow.apache.org/docs/python/parquet.html>

## 元々のエラー

`SyntaxError: Cannot use import statement outside a module`
エラーについては、おそらく、package.json で上手く設定できていないのではと思います。詳しくはドキュメント
<https://nodejs.org/api/packages.html#packages_determining_module_system>
かこちらの Q&A <https://stackoverflow.com/a/59399717/5989200> をご覧ください。
CC BY-SA 4.0
2021-06-19T14:13:00.913
77657
2021-06-19T14:13:00.913
19110
77430
answer