Не удалось конвертировать из Parquet в csv [duplicate]

Если ваш grep не поддерживает рекурсивный поиск, вы можете комбинировать find с xargs:

find / -type f | xargs grep 'text-to-find-here'

Мне это легче запомнить, чем формат для find -exec.

Это приведет к отображению имени файла и содержимого соответствующей строки, например

/home/rob/file:text-to-find-here

Дополнительные флаги, которые вы можете добавить к grep:

  • -i - нечувствительный к регистру поиск
  • -l - выводит только имя файла, в котором было найдено совпадение
  • -h - выводить только строку, которая соответствует (не filename)
15
задан author243 30 September 2014 в 16:18
поделиться

7 ответов

Здесь - образец фрагмента кода, который делает это в обоих направлениях.

12
ответ дан Pratik Khadloya 22 August 2018 в 11:15
поделиться
  • 1
    Привет @Pratik, можете ли вы помочь мне, разделив формат файла схемы паркета для файла csv – u449355 9 April 2015 в 10:06
  • 2
    Я использовал файл схемы avro. – Pratik Khadloya 9 April 2015 в 14:37
  • 3
    @PratikKhadloya - при преобразовании файла csv в паркет, convertCsvToParquet метод ищет файл .schema. Не могли бы вы посоветовать, как его создать. – sras 12 April 2016 в 10:14
  • 4
    Почему бы вам не добавить код в ответ? – Serendipity 29 August 2016 в 07:53
  • 5
    В примере в ссылке не указано, как определить схему. Глядя на код pyspark для преобразования csv в паркет, выполняется очень мало строк кода. Это можно найти здесь blogs.quovantis.com/how-to-convert-csv-to-parquet-files не уверен, как это сделать в Java – Jai Prakash 30 May 2017 в 01:50

Следующий пример является примером использования 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")
4
ответ дан Dylan Hogg 22 August 2018 в 11:15
поделиться

Чтение csv-файлов как Dataframe в Apache Spark с пакетом spark-csv . после загрузки данных в 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")
1
ответ дан Milad Khajavi 22 August 2018 в 11:15
поделиться

Я уже опубликовал ответ о том, как это сделать, используя Apache Drill. Однако, если вы знакомы с Python, вы можете сделать это, используя Pandas и PyArrow !

Установить зависимости

Использование pip:

pip install pandas pyarrow

или с помощью conda:

conda install pandas pyarrow -c conda-forge

Преобразование CSV в паркет в куски

# csv_to_parquet.py

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

csv_file = '/path/to/my.tsv'
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!).

6
ответ дан ostrokach 22 August 2018 в 11:15
поделиться
  • 1
    Я подтверждаю, что это лучший и простой способ добиться этого. Apache Hive также может быть альтернативой. – Thomas Decaux 6 October 2016 в 22:04
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 22 August 2018 в 11:15
поделиться

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) Еще одна таблица улей, в которой будет храниться файл паркета

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'

. Вставьте таблицу в одну таблицу в таблицу :

insert overwrite table emp_par select * from emp 
2
ответ дан syadav 22 August 2018 в 11:15
поделиться
  • 1
    Таблица emp_par была создана как ВНЕШНИЙ ТАБЛИЦ. Это должно было быть создано как обычная таблица, иначе вы не сможете вставлять в нее данные. – Jai Prakash 29 May 2017 в 23:55

Вы можете использовать Apache Drill , как описано в . Преобразовать CSV-файл в Apache Parquet With Drill .

Вкратце:

Начать сверление Apache:

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

Создать файл Parquet:

-- Set default table format to parquet
ALTER SESSION SET `store.format`='parquet';

-- Create a parquet table containing all data from the CSV table
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] as `IATA_CODE`,
columns[3] as `AIRLINE_2`,
columns[4] as `IATA_CODE_2`,
columns[5] as `GEO_SUMMARY`,
columns[6] as `GEO_REGION`,
columns[7] as `ACTIVITY_CODE`,
columns[8] as `PRICE_CODE`,
columns[9] as `TERMINAL`,
columns[10] as `BOARDING_AREA`,
CAST(columns[11] AS DOUBLE) as `PASSENGER_COUNT`
FROM dfs.`/opendata/Passenger/SFO_Passenger_Data/*.csv`;

Попробовать выбрать данные из нового файла Parquet:

-- Select data from parquet table
SELECT *
FROM dfs.tmp.`/stats/airport_data/*`

Вы можете изменить местоположение dfs.tmp, выбрав http://localhost:8047/storage/dfs (источник: CSV и паркет ).

6
ответ дан ostrokach 22 August 2018 в 11:15
поделиться
  • 1
    Я подтверждаю, что это лучший и простой способ добиться этого. Apache Hive также может быть альтернативой. – Thomas Decaux 6 October 2016 в 22:04
Другие вопросы по тегам:

Похожие вопросы: