У меня есть таблицы, определенные (через CF) таким образом в моих каталогах клея:
MyTable:
Type: AWS::Glue::Table
DependsOn : RealyseCatalogDB
Properties:
CatalogId: !Ref AWS::AccountId
DatabaseName: !Ref CatalogDatabaseName
TableInput:
Name: 'customers'
Description: Some test data
TableType: EXTERNAL_TABLE
Parameters: {
"skip.header.line.count": "1",
"compressionType": "none",
"classification": "csv",
"columnsOrdered": "true",
"areColumnsQuoted": "true",
"delimiter": ",",
"typeOfData": "file"
}
StorageDescriptor:
OutputFormat: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat
Columns:
- Name: id
Type: bigint
- Name: startDate
Type: date
- Name: finalNumber
Type: smallint
- Name: price
Type: int
- Name: sumIndicator
Type: tinyint
- Name: officialName
Type: string
InputFormat: org.apache.hadoop.mapred.TextInputFormat
Location: !Sub ${SomewhereS3BasePath}/MyFile.csv
SerdeInfo:
SerializationLibrary: org.apache.hadoop.hive.serde2.OpenCSVSerde
В своем коде клея / искры я читаю данные из этой таблицы, используя:
val df = spark.glueContext.getCatalogSource(
database = "test-db",
tableName = "customers"
).getDynamicFrame().toDF()
но типы date
, tinyint
, smallint
преобразуются в строки вместо эквивалентных типов Spark: DateType
, ByteType
и ShortType
. Поэтому я вынужден добавить:
df
.withColumn("startDate",col("startDate").cast(DateType))
.withColumn("finalNumber",col("finalNumber").cast(ShortType))
.withColumn("sumIndicator",col("sumIndicator").cast(ByteType))
, что побеждает цель определения таблицы в CF. Есть ли решение, чтобы избежать этого? Я попытался с очень простыми тестовыми данными с четко определенными значениями, чтобы избежать ситуаций "resolChoices", но все же проблема.