Apache Parquet 文件导入器此插件以交互方式导入 Apache Parquet 文件( https://parquet.apache.org/ ) 到 JMP 表中。
它由两个命令组成:
- 单文件:选择单个 .parquet 文件,检查其有效性,然后在出现确认消息后创建并打开生成的 JMP 数据表,或者如果文件无效则发出警告消息;
- 多个文件:选择包含所有 .parquet 文件的文件夹并打开生成的 JMP 表(注意:该文件夹必须包含仅有效.parquet 文件,没有其他文件或子文件夹)
系统要求:
使用标准 Python 更新工具为您的 Python 配置安装这些包。
注意:为了测试插件,您可以在此处找到示例 Parquet 文件: https://github.com/Teradata/kylo/tree/master/samples/sample-data/parquet
第三方集成回复:Apache Parquet 文件导入器最大限度,
我在 JMP Pro 17.2 中测试了该插件,以检查加载通过 pandas 生成的 parquet 文件,但它不起作用,它无法识别该文件(即使我可以使用 Tad 等 parquet 阅读器程序读取它)。
期待任何帮助,谢谢!
回复:Apache Parquet 文件导入器嗨,迪米戈,
你安装了所有需要的Python包了吗?
如果是,请分享 JMP 日志,以便我们更好地了解正在发生的情况。
顺便说一句,JMP V18(预计于 2024 年 3 月发布)将具有更直接的 JMP-Python 链接,因此我们很可能会更新该插件。
干杯,马西莫
回复:Apache Parquet 文件导入器最大限度,
我想我已经得到了所有的包,这是我的设置:
Python版本3.11.7
numpy 版本 1.26.3
熊猫版本2.1.4
matplotlib 版本 3.8.0
scipy 版本 1.11.4
sqlite3(包含在Python基础中)
PyQt5 版本 5.15.10
pyarrow 版本 14.0.2
我唯一能想到的是,我通过 conda 管理基础环境上的包,不确定这是否存在冲突。或者Python在我的电脑上的设置方式......
这是 JMP 的日志:
/*:
/*********/
将 numpy 导入为 np
将 pandas 导入为 pd
将 pyarrow 导入为 pa
将 pyarrow.parquet 导入为 pq
# 从 Parquet 格式读取表
表 = pq.read_table(parquet_file)
# 将表转换为 pandas 兼容的 DataFrame
df = 表.to_pandas()
#打印(df)
/*********/
即使使用简单的示例镶木地板文件,我也会遇到相同的错误:

回复:Apache Parquet 文件导入器嗨,迪米戈,
配置看起来没问题,conda 应该不是问题。
日志没有说太多。
您能否与我们分享您正在使用的 parquet 文件,以便我们可以直接使用它进行测试?
谢谢,马西莫
回复:Apache Parquet 文件导入器使用原始链接中的示例文件: https://github.com/Teradata/kylo/tree/master/samples/sample-data/parquet,也不起作用。所以我无法加载任何这些文件,我收到相同的错误消息。
回复:Apache Parquet 文件导入器您好,应该不是链接,但可能一定与插件安装有关,可能与 JMP Pro v17.2 冲突。
您能否尝试在脚本窗口中复制并运行下面的脚本(没有加载项),并告诉我它是否有效?
谢谢,马西莫
//<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();
回复:Apache Parquet 文件导入器直接来自我的 JMP Discovery Summit 演示文稿,这是一个用于处理 parquet 文件的 JMP 18 脚本,我们直接从 Parquet 列转到 jmp.DataTable Python 对象。JMP 18 允许从 Python 实时创建、读取和修改 JMP 数据表。以下脚本使用 Teradtata 示例文件之一,访问 parquet 文件的架构并直接在 Python 中创建可比较的数据表列。以下内容直接从 JMP 18 中的 Python 感知脚本编辑器运行。导入 jmp包仅在 JMP 内部可用,因为它是在 JMP 可执行文件的代码库中编写为 C++ 扩展的。
# 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
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.new_column(name, jmp.数据类型.数值)
# 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.数据类型.数字) # Numeric
dt[名称] = table.column(idx).to_pylist()
return col
# Create JMP data table with four of the columns from the table by name
dt = 跳转数据表('From Parquet', pq_Table.num_rows)
# could just as easily create all columns
# 对于 pq_Table.column_names 中的 n:
# 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. (格式和宽度)
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}')
回复:Apache Parquet 文件导入器最大限度,
该脚本运行良好,我可以成功加载 parquet 文件。这确实非常有用,我可以直接运行该脚本来代替插件。感谢您的帮助!
但确实存在插件问题,无法在我当前安装的 JMP Pro 中运行。但脚本可以运行。