PyArrow中如何将JSON字符串字段转换为date32类型?
问题:PyArrow中字符串转date32类型报错如何解决?
给定JSON数据:
{ "C_0_0":"2022-1-1" }
指定的Schema定义:
import pyarrow as pa import pyarrow.json as pajson raw_schema = pa.schema([ pa.field("C_0_0", pa.string()), ]) new_schema = pa.schema([ pa.field("C_0_0", pa.date32()), ])
执行以下读取并转换类型的代码:
file_path = '/home/i574375/views/links/gitenv/gitsrc/sqla/src/db/engine/datalake_shared_resources/tests/pyunit/testscripts/datalake/abc.json' table = pajson.read_json(file_path, parse_options = pajson.ParseOptions(explicit_schema = raw_schema)) table = table.cast(new_schema)
触发报错:
pyarrow.lib.ArrowNotImplementedError: Unsupported cast from string to date32 using function cast_date32
解决方案
PyArrow的cast方法不支持直接将字符串类型转为date32,需要先用字符串解析函数把日期字符串转换成日期类型,再替换原字段或构建新表。
方法一:先读字符串再解析转换
import pyarrow as pa import pyarrow.json as pajson import pyarrow.compute as pc file_path = '/home/i574375/views/links/gitenv/gitsrc/sqla/src/db/engine/datalake_shared_resources/tests/pyunit/testscripts/datalake/abc.json' # 读取原始字符串类型表 table = pajson.read_json(file_path, parse_options = pajson.ParseOptions(explicit_schema = raw_schema)) # 解析日期字符串为date32类型 date_col = pc.strptime(table["C_0_0"], format="%Y-%m-%d", unit="s").cast(pa.date32()) # 替换原字段生成新表 new_table = table.set_column(0, "C_0_0", date_col) # 验证结果 print(new_table.schema)
方法二:读取时直接解析日期(更高效)
无需先读取为字符串类型,直接在读取JSON时指定日期解析规则:
import pyarrow as pa import pyarrow.json as pajson file_path = '/home/i574375/views/links/gitenv/gitsrc/sqla/src/db/engine/datalake_shared_resources/tests/pyunit/testscripts/datalake/abc.json' parse_options = pajson.ParseOptions( parse_dates=True, date_format="%Y-%m-%d" ) # 读取后直接得到date32类型的字段 table = pajson.read_json(file_path, parse_options=parse_options) print(table.schema)
关键说明
pc.strptime支持自动匹配不补零的月/日格式(如2022-1-1),无需额外处理。- 解析后得到的是timestamp类型,再通过
cast(pa.date32())转换为目标类型即可。
内容的提问来源于stack exchange,提问作者Abhik NASKAR
相关产品推荐
相关产品推荐

