PySpark / Glue: При использовании столбца даты в качестве ключа раздела он всегда преобразуется в строку? - PullRequest
0 голосов
/ 14 мая 2019

Я использую PySpark на AWS Glue.Появляется при записи набора данных со столбцом даты, используемым в качестве ключа раздела, он всегда преобразуется в строку?

df = df \
  .withColumn("querydatetime", to_date(df["querydatetime"], DATE_FORMAT_STR))
...
df \
  .repartition("querydestinationplace", "querydatetime") \
  .write \
  .mode("overwrite") \
  .partitionBy(["querydestinationplace", "querydatetime"]) \
  .parquet("s3://xxx/flights-test")

Я заметил, что DDL моей таблицы от Афины

CREATE EXTERNAL TABLE `flights_test`(
  `key` string, 
  `agent` int, 
  `queryoutbounddate` date, 
  `queryinbounddate` date, 
  `price` decimal(10,2), 
  `outdeparture` timestamp, 
  `indeparture` timestamp, 
  `numberoutstops` int, 
  `out_is_holiday` boolean, 
  `out_is_longweekends` boolean, 
  `in_is_holiday` boolean, 
  `in_is_longweekends` boolean)
PARTITIONED BY ( 
  `querydestinationplace` string, 
  `querydatetime` string)
ROW FORMAT SERDE 
  'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe' 
STORED AS INPUTFORMAT 
  'org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat' 
OUTPUTFORMAT 
  'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat'
LOCATION
  's3://xxx/flights-test/'
TBLPROPERTIES (...)

Уведомление

PARTITIONED BY ( 
  `querydestinationplace` string, 
  `querydatetime` string)

Должны ли столбцы раздела всегда быть строковыми?На самом деле querydestinationplace должен быть типом int.Будет ли этот тип строки менее эффективным, чем Int или Date?

1 Ответ

2 голосов
/ 14 мая 2019

Это известное поведение пакетета.Вы можете добавить следующую строку перед чтением файла паркета, чтобы пропустить это поведение:

# prevent casting the integer id fields, which are used for patitioning, 
# to be converted to integers.
sqlContext.setConf("spark.sql.sources.partitionColumnTypeInference.enabled", "false")
...