Java >> Java tutorial >  >> Java

Hvordan får man vist Apache Parquet-fil i Windows?

Hvad er Apache Parket?

Apache Parquet er et binært filformat, der gemmer data på en kolonneformet måde. Data inde i en Parquet-fil ligner en RDBMS-stiltabel, hvor du har kolonner og rækker. Men i stedet for at få adgang til dataene én række ad gangen, får du typisk adgang til dem én kolonne ad gangen.

Apache Parquet er et af de moderne store datalagringsformater. Det har flere fordele, hvoraf nogle er:

  • Søjlelager :effektiv datahentning, effektiv komprimering osv...
  • Metadata er i slutningen af ​​filen :gør det muligt at generere Parket-filer fra en strøm af data. (almindelig i big data-scenarier)
  • Understøttet af alle Apache big data-produkter

Har jeg brug for Hadoop eller HDFS?

Nej. Parketfiler kan gemmes i ethvert filsystem, ikke kun HDFS. Som nævnt ovenfor er det et filformat. Så det er ligesom enhver anden fil, hvor den har et navn og en .parket udvidelse. Hvad der dog normalt vil ske i big data-miljøer er, at ét datasæt bliver opdelt (eller opdelt) i flere parketfiler for endnu mere effektivitet.

Alle Apache big data-produkter understøtter Parquet-filer som standard. Så derfor kan det virke som om det kun kan eksistere i Apache-økosystemet.

Hvordan kan jeg oprette/læse parketfiler?

Som nævnt understøtter alle aktuelle Apache big data-produkter som Hadoop, Hive, Spark osv. Parket-filer som standard.

Så det er muligt at udnytte disse systemer til at generere eller læse parketdata. Men dette er langt fra praktisk. Forestil dig, at du for at læse eller oprette en CSV-fil skulle installere Hadoop/HDFS + Hive og konfigurere dem. Heldigvis er der andre løsninger.

Sådan opretter du dine egne parketfiler:

  • I Java se venligst mit følgende indlæg:Generer parketfil ved hjælp af Java
  • I .NET se venligst følgende bibliotek:parket-dotnet

Sådan får du vist parketfilens indhold:

  • Prøv venligst følgende Windows-værktøj:https://github.com/mukunku/ParquetViewer

Er der andre metoder?

Eventuelt. Men der findes ikke mange, og de er for det meste ikke veldokumenterede. Dette skyldes, at Parket er et meget kompliceret filformat (jeg kunne ikke engang finde en formel definition). Dem, jeg har angivet, er de eneste, jeg er opmærksom på, mens jeg skriver dette svar


Dette er muligt nu gennem Apache Arrow, som hjælper med at forenkle kommunikation/overførsel mellem forskellige dataformater, se mit svar her eller de officielle dokumenter i tilfælde af Python.

Grundlæggende giver dette dig mulighed for hurtigt at læse/skrive parketfiler i en pandas DataFrame som mode giver dig fordelene ved at bruge notebooks at se og håndtere sådanne filer, som om det var en almindelig csv fil.

EDIT:

Som et eksempel, givet den seneste version af Pandas , sørg for pyarrow er installeret:

Så kan du simpelthen bruge pandaer til at manipulere parketfiler:

import pandas as pd

# read
df = pd.read_parquet('myfile.parquet')

# write
df.to_parquet('my_newfile.parquet')

df.head()

Ud over @sals omfattende svar er der et yderligere spørgsmål, jeg stødte på i denne sammenhæng:

Hvordan får jeg adgang til dataene i en parketfil med SQL?

Da vi stadig er i Windows-sammenhæng her, kender jeg ikke til så mange måder at gøre det på. De bedste resultater blev opnået ved at bruge Spark som SQL-motor med Python som interface til Spark. Jeg går dog ud fra, at Zeppelin-miljøet også fungerer, men har ikke prøvet det selv endnu.

Der er en meget veludført guide af Michael Garlanyk til at guide en gennem installationen af ​​Spark/Python-kombinationen.

Når jeg først er sat op, er jeg i stand til at interagere med parketgulve gennem:

from os import walk
from pyspark.sql import SQLContext

sc = SparkContext.getOrCreate()
sqlContext = SQLContext(sc)

parquetdir = r'C:\PATH\TO\YOUR\PARQUET\FILES'

# Getting all parquet files in a dir as spark contexts.
# There might be more easy ways to access single parquets, but I had nested dirs
dirpath, dirnames, filenames = next(walk(parquetdir), (None, [], []))

# for each parquet file, i.e. table in our database, spark creates a tempview with
# the respective table name equal the parquet filename
print('New tables available: \n')

for parquet in filenames:
    print(parquet[:-8])
    spark.read.parquet(parquetdir+'\\'+parquet).createOrReplaceTempView(parquet[:-8])

Når du har fyldt dine parketter på denne måde, kan du interagere med Pyspark API f.eks. via:

my_test_query = spark.sql("""
select
  field1,
  field2
from parquetfilename1
where
  field1 = 'something'
""")

my_test_query.show()

Java tag