web-dev-qa-db-ja.com

CSVファイルを寄木細工に変換する方法

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

18
author243

ここ は、両方の方法で実行するコードのサンプルです。

11
Pratik Khadloya

Apache Drill を使用できます。詳細については、 CSVファイルをドリルでApache Parquetに変換 で説明しています。

簡単に言うと:

Apache Drillを開始します。

 $ cd /opt/drill/bin
$ sqlline -u jdbc:drill:zk = local 

Parquetファイルを作成します。

-デフォルトのテーブル形式を寄木細工に設定します
 ALTER SESSION SET `store.format` = 'parquet'; 
 
-すべてのデータを含む寄木細工のテーブルを作成しますCSVテーブルから
 CREATE TABLE dfs.tmp.`/stats/airport_data/`AS 
 SELECT 
 CAST(SUBSTR(columns [0]、1,4)AS INT) `YEAR`、
 CAST(SUBSTR(columns [0]、5,2)AS INT)` MONTH`、
 columns [1] as `AIRLINE`、
 columns [ 2]として `IATA_CODE`、
 columns [3]として` AIRLINE_2`、
 columns [4]として `IATA_CODE_2`、
 columns [5]として` GEO_SUMMARY`、
 columns [6]として `GEO_REGION`、
 columns [7]として` ACTIVITY_CODE`、
 columns [8]として `PRICE_CODE`、
 columns [9] `TERMINAL`、
 columns [10] as` BOARDING_AREA`、
 CAST(columns [11] AS DOUBLE)as `PASSENGER_COUNT` 
 FROM dfs.`/opendata/Passenger /SFO_Passenger_Data/*.csv`;

新しいParquetファイルからデータを選択してみてください。

-寄せ木細工のテーブルからデータを選択
 SELECT * 
 FROM dfs.tmp.`/stats/airport_data/* `

dfs.tmpに移動すると、http://localhost:8047/storage/dfsの場所を変更できます(ソース: CSVおよびParquet )。

11
ostrokach

Apache Drillを使用してこれを行う方法について 回答 をすでに投稿しました。ただし、Pythonに精通している場合は、 Pandas および PyArrow !を使用してこれを実行できます。

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

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バージョンに対してベンチマークしていませんが、私の経験では毎秒数万行を変換するのは非常に高速です(これはもちろんCSVファイルに依存します!)。

10
ostrokach

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

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")
6

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

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)寄せ木細工のファイルを保存する別のHiveテーブル

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 
2
Hemant Kumar

spark-csvパッケージApache Sparkのデータフレーム としてcsvファイルを読み取ります。データをデータフレームにロードした後、データフレームをparquetfileに保存します。

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")
1
Milad Khajavi
from pyspark import SparkContext
from pyspark.sql import SQLContext
from pyspark.sql.types import *
import sys

sc = SparkContext(appName="CSV2Parquet")
sqlContext = SQLContext(sc)

schema = StructType([
    StructField("col1", StringType(), True),
    StructField("col2", StringType(), True),
    StructField("col3", StringType(), True),
    StructField("col4", StringType(), True),
    StructField("col5", StringType(), True)])
rdd = sc.textFile('/input.csv').map(lambda line: line.split(","))
df = sqlContext.createDataFrame(rdd, schema)
df.write.parquet('/output.parquet')
0
Shuli Hakim