csv - 有没有办法将几 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 是不可能的。
解决方案
我知道一种更广泛的方法,如下所示:
>>> 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)
推荐阅读
- node.js - 使用 firebase 身份验证数据并从 firebase 用户向 mongodb 添加额外信息
- dart - 如何创建由群组图标照片中的用户组成的群聊图标(群组中用户的拼贴)
- javascript - optionComponent 和 valueComponent 在最新版本的 react-select 中不起作用
- javascript - 如何在“MadLibs”风格的文字游戏的 javascript 片段中编写非文字字符?
- php - 如何在 Laravel 5.7 中使用 Vue.js 文件(不是 CDN)?
- reactjs - 函数在 .then 之前完成
- sql - 自动恢复备份
- java - 至今无法解析“1999 年 4 月 10 日”
- python - 如何使用带有嵌套子级的python parse json
- java - 如果出现用户输入错误,如何防止处理我的 Java 代码?