У меня есть файл паркета на S3, который содержит несколько схем следующим образом:
s3://my_parquet_files
|-cid=abc
|-schema1.snappy.parquet
|-cid=xyz
|-schema2.snappy.parquet
Схемы для них:
Схема 1:
|-- a: integer (nullable = true)
|-- b: integer (nullable = true)
Схема 2:
|-- a: integer (nullable = true)
|-- b: integer (nullable = true)
|-- c: integer (nullable = true)
В кластере EMR следующий фрагмент кода работает правильно:
df = spark.read.option("mergeSchema", "true").parquet('s3://my_parquet_files')
df.show(n=5)
Однако, если те же данные считываются с использованием Spark SQL для таблицы, созданной в Афине, выдается ошибка:
spark = SparkSession.builder.appName('tmp').config("hive.metastore.client.factory.class", "com.amazonaws.glue.catalog.metastore.AWSGlueDataCatalogHiveClientFactory").config("spark.sql.parquet.mergeSchema","true").enableHiveSupport().getOrCreate()
qry = 'select * from parquet_table'
df = spark.sql(qry)
Выдает ошибку:
Caused by: java.lang.UnsupportedOperationException: org.apache.parquet.column.values.dictionary.PlainValuesDictionary$PlainLongDictionary
...
Для кластера EMR настроено следующее:
Распределение Hadoop : Amazon 2.8.5
Приложения : искра 2.4.0, улей 2.3.4, ливи 0.5.0, дирижабль 0.8.0, ганглии 3.7.2
Я хочу не читать файлы паркета и createOrReplaceTempView
и запускать на нем SQL.
Есть ли другие настройки, которые нужно установить? Как я могу прочитать данные с помощью SQL-запроса?