42

BigData は初めてです。csv/txt ファイルを Parquet 形式に変換する必要があります。私はたくさん検索しましたが、そうする直接的な方法を見つけることができませんでした。それを達成する方法はありますか?

4

10 に答える 10

40

Apache Drill を使用してこれを行う方法については、既に回答を投稿しました。ただし、Python に精通している場合は、PandasPyArrowを使用してこれを行うことができます。

依存関係をインストールする

使用pip:

pip install pandas pyarrow

または使用conda

conda install pandas pyarrow -c conda-forge

CSV をチャンク単位で Parquet に変換する

# csv_to_parquet.py

import pandas as pd
import pyarrow as pa
import pyarrow.parquet as pq

csv_file = '/path/to/my.tsv'
parquet_file = '/path/to/my.parquet'
chunksize = 100_000

csv_stream = pd.read_csv(csv_file, sep='\t', chunksize=chunksize, low_memory=False)

for i, chunk in enumerate(csv_stream):
    print("Chunk", i)
    if i == 0:
        # Guess the schema of the CSV file from the first chunk
        parquet_schema = pa.Table.from_pandas(df=chunk).schema
        # Open a Parquet file for writing
        parquet_writer = pq.ParquetWriter(parquet_file, parquet_schema, compression='snappy')
    # Write CSV chunk to the parquet file
    table = pa.Table.from_pandas(chunk, schema=parquet_schema)
    parquet_writer.write_table(table)

parquet_writer.close()

このコードを Apache Drill バージョンに対してベンチマークしたことはありませんが、私の経験では、1 秒あたり数万行を変換するほど高速です (これはもちろん CSV ファイルに依存します!)。


編集:

を使用して、CSV ファイルを PyArrow テーブルに直接読み込むことができるようになりまし pyarrow.csv.read_csvた。これはおそらく Pandas CSV リーダーを使用するよりも高速ですが、柔軟性に欠ける場合があります。

于 2017-08-10T16:07:24.953 に答える
7

次のコードは、spark2.0 を使用した例です。読み取りは、inferSchema オプションよりもはるかに高速です。Spark 2.0 は、spark1.6 よりもはるかに効率的に parquet ファイルに変換されます。

import org.apache.spark.sql.types._
var df = StructType(Array(StructField("timestamp", StringType, true),StructField("site", StringType, true),StructField("requests", LongType, true) ))
df = spark.read
          .schema(df)
          .option("header", "true")
          .option("delimiter", "\t")
          .csv("/user/hduser/wikipedia/pageviews-by-second-tsv")
df.write.parquet("/user/hduser/wikipedia/pageviews-by-second-parquet")
于 2017-01-09T17:09:56.427 に答える
2

1)外部ハイブテーブルを作成できます

create  external table emp(name string,job_title string,department string,salary_per_year int)
row format delimited
fields terminated by ','
location '.. hdfs location of csv file '

2) 寄木細工のファイルを格納する別のハイブ テーブル

create  external table emp_par(name string,job_title string,department string,salary_per_year int)
row format delimited
stored as PARQUET
location 'hdfs location were you want the save parquet file'

テーブル 1 のデータをテーブル 2 に挿入します。

insert overwrite table emp_par select * from emp 
于 2017-01-18T16:44:25.437 に答える
1

spark-csv packageを使用して、 csv ファイルをApache Spark の Dataframeとして読み取ります。データをデータフレームにロードした後、データフレームを寄木細工のファイルに保存します。

val df = sqlContext.read
      .format("com.databricks.spark.csv")
      .option("header", "true")
      .option("inferSchema", "true")
      .option("mode", "DROPMALFORMED")
      .load("/home/myuser/data/log/*.csv")
df.saveAsParquetFile("/home/myuser/data.parquet")
于 2016-07-16T07:10:38.553 に答える