Как избежать того, чтобы таблицы каталога AWS / Glue изменили тип данных столбцов? - PullRequest
0 голосов
/ 25 апреля 2020

У меня есть таблицы, определенные (через 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", но все же проблема.

1 Ответ

0 голосов
/ 26 апреля 2020

Это связано с ограничением OpenCSVSerde, который обрабатывает все типы данных столбцов как строки [1] . Если вам нужны желаемые типы данных для ваших столбцов, вы можете добиться того же, используя преобразование Glue applyMapping, см. Пример [2] .

...