0

我对 pandas、pyarrow 和 bigsql 有疑问。基本上我想读取 csv ,将其写入 parquet 并从 db 读取 parquet。但是从db读取文件时出现问题。Pandas dtype 和 db 数据类型不一样。

在 bigsql 中创建了一个表,例如:

CREATE EXTERNAL hadoop TABLE sch.test (
  id bigint ,
  integer_column integer
)

我有 csv 文件并将其加载到熊猫中

csv = pd.read_csv(x)
print(csv.head(20))

           id          integer_column 
0      200001                     0.0
1      200002                     0.0
2      200003                     0.0
3      200004                     0.0
4      200005                     0.0
5      200006                     0.0
6      200007                     0.0
7      200008                     0.0
8      200009                     0.0
9      200010                     0.0
10     200011                     0.0
11     200012                     0.0
12     200013                     0.0
13     200014                     0.0
14     200015                     0.0
15     200016                     NaN
16     200017                     NaN
17     200018                     NaN
18     200019                     NaN
19     200020                     NaN

纯 csv 看起来像这样

id,integer_column 
200001,0.0
200002,0.0
200016,

然后我尝试通过 pyarrow.parquet.ParquetWriter 从中写入镶木地板文件

    import pyarrow.parquet as pq
    csv = pd.read_csv(x)
    table = pa.Table.from_pandas(csv)
    pqwriter = pq.ParquetWriter('./filename.prq', table.schema,coerce_timestamps='ms', \
               allow_truncated_timestamps=True,flavor='spark')            
    pqwriter.write_table(table)
    pqwriter.close()
    print(pa.Schema.from_pandas(csv ))
id: int64
integer_column : double
metadata
--------
{b'pandas': b'{"index_columns": [{"kind": "range", "name": null, "start": 0, "'
            b'stop": 25000, "step": 1}], "column_indexes": [{"name": null, "fi'
            b'eld_name": null, "pandas_type": "unicode", "numpy_type": "object'
            b'", "metadata": {"encoding": "UTF-8"}}], "columns": [{"name": "id
            b, "field_name": "id", "pandas_type": "int64", "nu'
            b'mpy_type": "int64", "metadata": null}, {"name": "integer_column '
            b'medelta", "field_name": "integer_column", "pandas_type":'
            b' "float64", "numpy_type": "float64", "metadata": null}], "creato'
            b'r": {"library": "pyarrow", "version": "0.15.1"}, "pandas_version'
            b'": "0.25.3"}'}

所以我想将它 integer_column 转换为整数并摆脱浮点数,然后将其写入 hive/bigsql 能够读取的 parquet 中。当我像我显示的那样插入它时,会出现错误:

bigsql :他的语句失败,因为 Big SQL 组件遇到错误。收到错误的组件:“BigSQL IO”。返回错误的组件:“未知”。SQLCODE=-5105,SQLSTATE=58040

hive : SQL 错误: java.io.IOException: org.apache.hadoop.hive.ql.metadata.HiveException: java.lang.ClassCastException: org.apache.hadoop.hive.serde2.io.DoubleWritable 不能转换为 org. apache.hadoop.io.IntWritable

我不能强制 pandas 或 pyarrow 正确地将 double 转换为整数。我知道它是双重的,因为有空值及其熊猫自然行为,但是我怎样才能将它作为具有空值的整数正确插入到 db 中?

唯一可行的解​​决方案是将 db 列更改为 double 类型或在此 pandas 列上制作 fillna(0).astype(np.int32) - 但我在这里丢失了信息。

如果您有任何想法,请分享您的知识。谢谢。

解决:pandas/pyarrow 升级和下面的代码有帮助。

csv['integer_column'] = csv['integer_column'].astype('Int64')

4

1 回答 1

0

Pandas 0.24.0 及更高版本支持可为空的整数列,因此您可以在 pandas 中进行转换。

csv['integer_column'] = csv['integer_column'].astype('Int64')

或者您可以使用 pyarrow 计算函数在 pyarrow 中将 float 转换为 int。

table = table.set_column(1, table.column_names[1], pc.cast(table.column(1), pa.int64()))
于 2021-03-07T07:06:57.167 回答