首页 > 解决方案 > 有没有办法将几 1000 列从字符串转换为整数,同时保存为镶木地板文件?

问题描述

使用 pyspark,我从 JSON 文件中提取 1500 个字段并保存为 parquet 并创建 hive 外部表。从 JSON 中提取的所有字段都是字符串格式。在 Hive DDL 中,所有列名都应该是整数。当我保存为镶木地板并查询配置单元表时,我看到以下错误:

java.io.IOException:org.apache.hadoop.hive.ql.metadata.HiveException:java.lang.ClassCastException

有没有办法处理这个错误?

在另存为镶木地板之前将列转换为 Int 会有所帮助。但是将 1500 列显式转换为 Integer 是不可能的。

标签: csvapache-sparkhivepysparkparquet

解决方案


我知道一种更广泛的方法,如下所示:

>>> from pyspark.sql.types import *
>>> from pyspark.sql.functions import col
# Consider df to be the dataframe from reading the JSON file.
>>> df.show()
+-------+------+
|details|header|
+-------+------+
|    def|   2.0|
+-------+------+

>>> df.printSchema()
root
 |-- details: string (nullable = true)
 |-- header: string (nullable = true)

# Convert all columns to integer type.
>>> df_parq=df.select(*(col(c).cast(IntegerType()).alias(c) for c in df.columns))
>>> df_parq.printSchema()
root
 |-- details: integer (nullable = true)
 |-- header: integer (nullable = true)

# Write file with modified column types to Parquet.
>>> df_parq.write.parquet('F:\Parquet\sample_out3')
>>> df_read_parq=spark.read.parquet('F:\Parquet\sample_out3')
>>> df_read_parq.printSchema()
root
 |-- details: integer (nullable = true)
 |-- header: integer (nullable = true)

推荐阅读