以下是我的示例 csv 文件。
id,name,gender
1,isuru,male
2,perera,male
3,kasun,male
4,ann,female
我使用 pandas 库将上面的 csv 文件转换为 apache parquet。以下是我的代码。
import pandas as pd
df = pd.read_csv('./data/students.csv')
df.to_parquet('students.parquet')
之后,我将 parquet 文件上传到 s3 并创建了一个外部表,如下所示。
create external table imp.s1 (
id integer,
name varchar(255),
gender varchar(255)
)
stored as PARQUET
location 's3://sample/students/';
之后我只是运行选择查询,但出现以下错误。
select * from imp.s1
Spectrum Scan Error. File 'https://s3.ap-southeast-2.amazonaws.com/sample/students/students.parquet'
has an incompatible Parquet schema for column 's3://sample/students.id'.
Column type: INT, Parquet schema:\noptional int64 id [i:0 d:1 r:0]
(s3://sample/students.parquet)
您能帮我弄清楚这里出了什么问题吗?
对于可为 NULL 的整数值,Pandas 使用与 Parquet Amazon S3 中的 Bigint 对应的数据类型 Int64。
Parquet Amazon S3 文件数据类型 | 转型 | 描述 |
---|---|---|
Int32 | 整数 | -2,147,483,648 至 2,147,483,647(精度为 10,小数位数为 0) |
Int64 | Bigint | -9,223,372,036,854,775,808 至 9,223,372,036,854,775,807(精度为 19,小数位数为 0) |
调用
id
时需要显式设置 pandas.read_csv
的列类型。
df = pd.read_csv('./data/students.csv', dtype={'id': 'int32'})