提问人:Chris Wood 提问时间:9/6/2021 最后编辑:Chris Wood 更新时间:9/28/2022 访问量:2359
使用 Parquet 文件处理 Arrow 中的 UUID 值
Handling UUID values in Arrow with Parquet files
问:
我是 Python 和 Pandas 的新手 - 请温柔一点!
我正在将 SqlAlchemy 与 pymssql 一起使用,以对 SQL Server 数据库执行 SQL 查询,然后将结果集转换为数据帧。然后,我尝试将此数据帧编写为 Parquet 文件:
engine = sal.create_engine(connectionString)
conn = engine.connect()
df = pd.read_sql(query, con=conn)
df.to_parquet(outputFile)
我在 SQL 查询中检索的数据包括一个名为 的列(即 UUID)。因此,我在上面的最后一行收到以下错误:uniqueidentifier
rowguid
pyarrow.lib.ArrowInvalid: ("Could not convert UUID('92c4279f-1207-48a3-8448-4636514eb7e2') with type UUID: did not recognize Python value type when inferring an Arrow data type", 'Conversion failed for column rowguid with type object')
我有什么方法可以在上述事件链中的任何一点强制所有 UUID 为字符串?
一些额外的注意事项:
- 这部分代码的目标是将 SQL 查询文本作为参数接收,并充当泛型 SQL 到 Parquet 函数。
- 我意识到我可以做类似的事情,但它依赖于我知道哪些列有类型。当它成为数据帧时,一切都是 DataFrame,并且每个查询都会有所不同。
df['rowguid'] = df['rowguid'].astype(str)
uniqueidentifier
object
- 我也知道我可以在 SQL 查询本身中将其转换为 a,但是,我希望做一些更“自动”的事情,这样编写查询的人就不会一直意外地遇到这个问题/不必记住始终转换数据类型。
char(36)
有什么想法吗?
答:
-1赞
kleberbaum
9/28/2022
#1
试用 DuckDB
engine = sal.create_engine(connectionString)
conn = engine.connect()
df = pd.read_sql(query, con=conn)
df.to_parquet(outputFile)
# Close the database connection
conn.close()
# Create DuckDB connection
duck_conn = duckdb.connect(':memory:')
# Write DataFrame content to a snappy compressed parquet file
COPY (SELECT * FROM df) TO 'df-snappy.parquet' (FORMAT 'parquet')
裁判:
- https://duckdb.org/docs/guides/python/sql_on_pandas
- https://duckdb.org/docs/sql/data_types/overview
- https://duckdb.org/docs/data/parquet
评论
1赞
Alleo
8/22/2023
欣赏解决方法,但我觉得应该有一种不涉及安装 duckdb 的方法。
评论
object
object