Есть ли способ конвертировать несколько 1000 столбцов из строки в целое число, сохраняя при этом как файл паркета? - PullRequest
0 голосов
/ 09 июля 2019

Используя pyspark, я извлекаю 1500 полей из файла JSON, сохраняю их как паркет и создаю внешнюю таблицу улья.Все поля, извлеченные из JSON, представлены в строковом формате.В Hive DDL все имена столбцов должны быть целочисленными.Когда я сохраняю как паркет и запрашиваю таблицу кустов, я вижу ошибку ниже:

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

Есть ли способ справиться с этой ошибкой?

Преобразование столбцов в Int перед сохранением, как помогает паркет.Но явное преобразование 1500 столбцов в Integer будет невозможно.

1 Ответ

0 голосов
/ 10 июля 2019

Я знал более широкий способ сделать это следующим образом:

>>> 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)
...