Что такое совместимый тип данных для bigint в Spark и как мы можем преобразовать bigint в искровой совместимый тип данных? - PullRequest
0 голосов
/ 11 февраля 2019

Я пытаюсь переместить данные из greenplum в HDFS с помощью Spark.Я могу успешно прочитать данные из исходной таблицы, и предполагаемая схема искры информационного кадра (таблицы greenplum):

Схема информационного кадра:

 je_header_id: long (nullable = true)
 je_line_num: long (nullable = true)
 last_updated_by: decimal(15,0) (nullable = true)
 last_updated_by_name: string (nullable = true)
 ledger_id: long (nullable = true)
 code_combination_id: long (nullable = true)
 balancing_segment: string (nullable = true)
 cost_center_segment: string (nullable = true)
 period_name: string (nullable = true)
 effective_date: timestamp (nullable = true)
 status: string (nullable = true)
 creation_date: timestamp (nullable = true)
 created_by: decimal(15,0) (nullable = true)
 entered_dr: decimal(38,20) (nullable = true)
 entered_cr: decimal(38,20) (nullable = true)
 entered_amount: decimal(38,20) (nullable = true)
 accounted_dr: decimal(38,20) (nullable = true)
 accounted_cr: decimal(38,20) (nullable = true)
 accounted_amount: decimal(38,20) (nullable = true)
 xx_last_update_log_id: integer (nullable = true)
 source_system_name: string (nullable = true)
 period_year: decimal(15,0) (nullable = true)
 period_num: decimal(15,0) (nullable = true)

Соответствующая схема кустатаблица:

je_header_id:bigint|je_line_num:bigint|last_updated_by:bigint|last_updated_by_name:string|ledger_id:bigint|code_combination_id:bigint|balancing_segment:string|cost_center_segment:string|period_name:string|effective_date:timestamp|status:string|creation_date:timestamp|created_by:bigint|entered_dr:double|entered_cr:double|entered_amount:double|accounted_dr:double|accounted_cr:double|accounted_amount:double|xx_last_update_log_id:int|source_system_name:string|period_year:bigint|period_num:bigint

Используя схему таблицы Hive, упомянутую выше, я создал приведенный ниже StructType, используя логику:

def convertDatatype(datatype: String): DataType = {
  val convert = datatype match {
    case "string"     => StringType
    case "bigint"     => LongType
    case "int"        => IntegerType
    case "double"     => DoubleType
    case "date"       => TimestampType
    case "boolean"    => BooleanType
    case "timestamp"  => TimestampType
  }
  convert
}

Подготовленная схема:

 je_header_id: long (nullable = true)
 je_line_num: long (nullable = true)
 last_updated_by: long (nullable = true)
 last_updated_by_name: string (nullable = true)
 ledger_id: long (nullable = true)
 code_combination_id: long (nullable = true)
 balancing_segment: string (nullable = true)
 cost_center_segment: string (nullable = true)
 period_name: string (nullable = true)
 effective_date: timestamp (nullable = true)
 status: string (nullable = true)
 creation_date: timestamp (nullable = true)
 created_by: long (nullable = true)
 entered_dr: double (nullable = true)
 entered_cr: double (nullable = true)
 entered_amount: double (nullable = true)
 accounted_dr: double (nullable = true)
 accounted_cr: double (nullable = true)
 accounted_amount: double (nullable = true)
 xx_last_update_log_id: integer (nullable = true)
 source_system_name: string (nullable = true)
 period_year: long (nullable = true)
 period_num: long (nullable = true)

Когда я пытаюсь применить свою newSchema к схеме данных, я получаю исключение:

java.lang.RuntimeException: java.math.BigDecimal is not a valid external type for schema of bigint

Я понимаю, что он пытается преобразовать BigDecimal в Bigint, и это не удается, но кто-нибудь может сказатьКак я могу привести BigIn к типу данных, совместимому с искрой?Если нет, как я могу изменить свою логику, чтобы получить правильные типы данных в выражении case для этой проблемы bigint / bigdecimal?

1 Ответ

0 голосов
/ 11 февраля 2019

Здесь, увидев ваш вопрос, кажется, что вы пытаетесь преобразовать значение bigint в большое десятичное число, что неправильно.Bigdecimal - десятичное число, которое должно иметь фиксированную точность (максимальное количество цифр) и масштаб (количество цифр справа от точки).А твое это похоже на долгую ценность.

Здесь вместо использования типа данных BigDecimal попробуйте использовать LongType для правильного преобразования значения bigint.Посмотри, решит ли это твою цель.

...