Apache Parquet-DateiimporterDieses Add-In importiert interaktiv Apache Parquet-Dateien ( https://parquet.apache.org/ ) in JMP-Tabellen.
Es besteht aus zwei Befehlen:
- Einzelne Datei : Wählen Sie eine einzelne .parquet-Datei aus, prüfen Sie deren Gültigkeit und erstellen und öffnen Sie dann nach einer Bestätigungsmeldung die resultierende JMP-Datentabelle oder geben Sie eine Warnmeldung aus, wenn die Datei ungültig ist.
- Mehrere Dateien : Wählen Sie einen Ordner mit allen .parquet-Dateien aus und öffnen Sie die resultierenden JMP-Tabellen (Hinweis: Der Ordner muss enthalten nur gültig .parquet-Dateien und keine anderen Dateien oder Unterordner)
System Anforderungen:
Verwenden Sie die Standard-Python-Update-Tools, um diese Pakete für Ihre Python-Konfiguration zu installieren.
Hinweis: Um das Add-in zu testen, finden Sie hier eine Parquet-Beispieldatei: https://github.com/Teradata/kylo/tree/master/samples/sample-data/parquet
Integration von DrittanbieternBetreff: Apache Parquet-DateiimporterMaximal,
Ich habe das Add-In in JMP Pro 17.2 getestet, um das Laden einer über Pandas generierten Parquet-Datei zu überprüfen, und es hat nicht funktioniert, es erkennt die Datei nicht (auch wenn ich sie mit Parquet-Reader-Programmen wie Tad lesen kann).
Ich freue mich über jede Hilfe, danke!
Betreff: Apache Parquet-DateiimporterHallo dmdiego,
Haben Sie alle benötigten Python-Pakete installiert?
Wenn ja, teilen Sie uns bitte das JMP-Protokoll mit, damit wir besser sehen können, was passiert.
Übrigens wird JMP V18 (das voraussichtlich im März 2024 ausgeliefert wird) über eine direktere JMP-Python-Verbindung verfügen, sodass die Chancen gut stehen, dass wir das Add-In aktualisieren werden.
Prost, Massimo
Betreff: Apache Parquet-DateiimporterMaximal,
Ich glaube, ich habe alle Pakete bekommen, das ist mein Setup:
Python-Version 3.11.7
Numpy-Version 1.26.3
Pandas-Version 2.1.4
Matplotlib-Version 3.8.0
Scipy-Version 1.11.4
sqlite3 (in der Python-Basis enthalten)
PyQt5-Version 5.15.10
Pyarrow-Version 14.0.2
Das Einzige, was mir einfällt, ist, dass ich meine Pakete in der Basisumgebung über Conda verwalte und nicht sicher bin, ob das ein Konflikt ist. Oder die Art und Weise, wie Python auf meinem Computer eingerichtet wurde ...
Dies ist das Protokoll von JMP:
/*:
/**********/
numpy als np importieren
Pandas als PD importieren
Schafgarbe als pa importieren
Importiere pyarrow.parquet als pq
# Lesen Sie eine Tabelle im Parquet-Format
table = pq.read_table(parquet_file)
# Tabelle in einen Pandas-kompatiblen DataFrame konvertieren
df = table.to_pandas()
#print(df)
/**********/
Selbst bei einfachen Beispiel-Parkettdateien erhalte ich die gleiche Fehlermeldung:

Betreff: Apache Parquet-DateiimporterHallo dmdiego,
Die Konfiguration scheint in Ordnung zu sein und Conda sollte kein Problem darstellen.
Das Protokoll sagt nicht viel.
Könnten Sie uns bitte die von Ihnen verwendete Parkettfeile mitteilen, damit wir sie direkt testen können?
Danke, Massimo
Betreff: Apache Parquet-DateiimporterDie Verwendung der Beispieldateien in Ihrem ursprünglichen Link: https://github.com/Teradata/kylo/tree/master/samples/sample-data/parquet hat ebenfalls nicht funktioniert. Da ich keine dieser Dateien laden kann, erhalte ich die gleiche Fehlermeldung.
Betreff: Apache Parquet-DateiimporterHallo, das sollte nicht verlinkt sein, aber möglicherweise hängt es mit der Add-In-Installation zusammen, die zu Konflikten mit JMP Pro v17.2 führen kann.
Könnten Sie bitte versuchen, das folgende Skript zu kopieren und in einem Skriptfenster (ohne das Add-In) auszuführen, und mir sagen, ob es funktioniert?
Danke, Massimo
//<BR />Names Default To Here( 1 );
// Pick Parquet file from directory
parquet_file_pf = Pick File( "Select Parquet File", , {"Parquet Files|parquet"} );
// Create Parquet_file string to pass to Python - exclude initial slash
parquet_file = Substr( parquet_file_pf, 2 );
// Extract Parquet file name without .parquet extension - to be used as JMP table name
parquet_filename = Word( -2, parquet_file, "/." );
// Show( parquet_file );
// Init Python connection
Python Init();
// Send Parquet complete file string to Python
Python Send( parquet_file );
//Python Submit( "print(parquet_file)" );
// Read Parquet file as a table, then read table as pandas DataFrame
Python Submit(
"\[
import numpy as np
import pandas as pd
import pyarrow as pa
import pyarrow.parquet as pq
# Read a Table from Parquet format
table = pq.read_table(parquet_file)
# Convert Table to a pandas-compatible DataFrame
df = table.to_pandas()
#print(df)
]\"
);
// Get DataFrame as a JMP Data Table
dt = Python Get( df );
// check dt successfully imported
Try(
Is Missing( dt );
table_imported = 0;
,
table_imported = 1
);
// if dt is not a valid data table, set error message and close program
If( (table_imported == 0),
nw = New Window( "Import not successful", Modal, Text Box( "File " || parquet_filename || ".parquet is not a valid Parquet file" ) );
Stop();
);
// If dt is valid, continue execution
// Rename JMP Data Table as Parquet file name without extension
dt << Set Name( parquet_filename );
// Modal message window to confirm import
import_message = "File " || parquet_filename || ".parquet successfully imported";
nw = New Window( "Import successful", Modal, Text Box( import_message ) );
// Open JMP Data Table
dt << New Data View;
// Save JMP Data Table
// dt << Save();
// Terminate Python session
Python Term();
Betreff: Apache Parquet-DateiimporterDirekt aus meiner Präsentation auf dem JMP Discovery Summit: Ein JMP 18-Skript zur Verarbeitung von Parquet-Dateien, bei dem wir direkt von der Parquet-Spalte zu einem jmp.DataTable-Python-Objekt wechseln. JMP 18 ermöglicht das Live-Erstellen, Lesen und Ändern von JMP-Datentabellen aus Python. Das folgende Skript verwendet eine der Teradtata-Beispieldateien, greift auf das Schema der Parquet-Datei zu und erstellt die vergleichbare Datentabellenspalte direkt in Python. Das Folgende wird direkt vom Python-fähigen Skripteditor in JMP 18 ausgeführt. Das Importpaket „jmp“ ist nur innerhalb von JMP verfügbar, da es als C++-Erweiterung innerhalb der Codebasis der ausführbaren JMP-Datei geschrieben ist.
# parquet.py
# Author: Paul R. Nelson
# JMP Statistical Discovery LLC
#
# Description:
# Directly read a pyarrow table and create a JMP datatable. Discovered
# some issues in EA-5, that prevented this from working as desired,
# There is a conditional based on jmp.__version__ to check for EA-6
# or newer.
#
# The data for this file comes from a repository that is Apache licensed.
# https://github.com/Teradata/kylo/blob/master/samples/sample-data/parquet/userdata1.parquet
#
jmp importieren
import pyarrow.parquet as pq
from pyarrow import types as ptypes
# verify JMP 18 EA-6 or newer
ver = jmp.__version__.split('.')
if(ver[0] == '0' and ver[1] < '6'):
print('This version requires JMP 18.0 EA-6 or newer.')
pq_Table = pq.read_table('/Users/me_me_me/Presentation/Parquet/userdata1.parquet')
# Create a helper function to build a JMP Column
# on DataTable 'dt' using parquet 'table', having column 'name'
def dtcol_from_pq_col_name(dt, table, name):
col = None
idx = table.schema.get_field_index(name)
col_type = table.schema[idx].type
print(f'{name}: {table.schema[idx].type}')
if ptypes.is_string(col_type):
col = dt.new_column(name, jmp.DataType.Character)
elif ptypes.is_date(col_type):
# This table does not contain a date column do this is unimplemented
print("FixMe: got a date column")
return None
elif ptypes.is_timestamp(col_type):
col = dt.neue_Spalte(name, jmp.DataType.Numeric)
# add JMP epoch time correction factor - 1Jan1904
timestamps = [ts.timestamp()+ 2082844800.0 for ts in table.column(idx).to_pylist()]
dt[name] = timestamps
# change column info to timestamp, and set an appropriate column width.
jmp.run_jsl(f'Data Table( "{dt.name}" ):{name} << Input Format( "yyyy-mm-dd" ) << Format( "yyyy-mm-ddThh:mm:ss", 19 ) << Set Display Width( 200 );')
else:
col = dt.new_column(name, jmp.DataType.Numeric) # Numeric
dt[Name] = table.column(idx).to_pylist()
return col
# Create JMP data table with four of the columns from the table by name
dt = jmp.Datentabelle('From Parquet', pq_Table.num_rows)
# could just as easily create all columns
# für n in pq_Table.column_names:
# instead of iterating on the list below
col_list = [ 'registration_dttm', 'first_name', 'last_name', 'salary']
for n in col_list:
dtcol_from_pq_col_name(dt, pq_Table, n)
# set column properties by calling JSL from Python. (Formate & Breiten)
jmp.run_jsl('''
// Change column display width: last_name
Data Table( "From Parquet" ):last_name << Set Display Width( 105 );
// Change column display width: Salary
Data Table( "From Parquet" ):salary << Set Display Width( 150 ) << Format( "Currency", "USD", 17, 2 );
''')
# display data about the parquet file
print(f'Table Rows: {len(pq_Table)}' )
print(f'Table Shape: {pq_Table.shape}')
print(f'Table Schema:\n{pq_Table.schema}')
print(pq_Table.schema.field('salary').type)
print(f'Column Names: {pq_Table.column_names}')
print(f'Num Columns: {pq_Table.num_columns}')
Betreff: Apache Parquet-DateiimporterMaximal,
Das Skript funktioniert sehr gut und ich kann Parquet-Dateien erfolgreich laden. Das wird in der Tat sehr nützlich sein, denn anstelle des Add-Ins kann ich einfach das Skript ausführen. Vielen Dank für die freundliche Hilfe!
Aber tatsächlich gibt es ein Problem mit dem Add-In, das in meiner aktuellen Installation von JMP Pro nicht funktioniert. Aber das Skript funktioniert.