Как преобразовать столбец байтов (с логическим типом как десятичный) в Avro в десятичный?

У меня есть десятичный столбец «TOT_AMT», определенный как тип «байты» и логический тип «десятичный» в моей схеме avro.

После создания фрейма данных в искре с использованием модулей данных spark-avro, когда я попытался суммировать столбец TOT_AMT с помощью функции суммы, он выдает ошибку «Для суммы функции требуются числовые типы, а не двоичный тип» .

Столбец определен, как показано ниже, в схеме avro,

name = "TOT_AMT", "type": ["null", {"type": "bytes", "logicaltype": "decimal", "precision": 20, "scale": 10}]

Я создаю фрейм данных и резюмирую, как,

val df=sqlContext.read.format("com.databricks.spark.avro").load("input dir")
df.agg(sum("TOT_AMT")).show()

Кажется, что десятичное значение читается как двоичный тип при создании фрейма данных. В таком случае, как мы можем выполнять числовые операции с такими десятичными столбцами? Можно ли будет преобразовать этот массив байтов в BigDecimal, а затем выполнить вычисления.


person Anand B    schedule 06.03.2017    source источник
comment
Можете ли вы предоставить схематический код или обзор ваших данных? Особенно важно состояние вашего текущего RDD до сокращения. Явное приведение типов, скорее всего, поможет.   -  person dennlinger    schedule 06.03.2017


Ответы (1)


Согласно Поддерживаемые типы для Avro -> Преобразование Spark SQL, bytes Тип Avro преобразуется в BinaryType Spark SQL (см. Также код).

Согласно исходный код вы можете определить свою собственную схему, используя параметр avroSchema, т. е.

spark.read
  .format("com.databricks.spark.avro")
  .option("avroSchema", yourSchemaHere)

Это дает вам возможность указать отображение от BinaryType до Decimal.

Вы также можете использовать функцию cast для преобразования двоичного значения в десятичный формат.

p.s. Я не знаю, поддерживает ли читатель logicaltype подсказок, определенных в схеме Avro. Было бы неплохо иметь такую ​​функцию, если она сейчас недоступна.

person Jacek Laskowski    schedule 31.03.2017
comment
Есть ли способ прочитать метаданные схемы AVRO (например, logicalType) с помощью DataFrame? Я пробовал avroDataFrame.schema.fields.map (f = ›f.metadata), но карта пуста? - person Ashika Umanga Umagiliya; 23.04.2020
comment
@AshikaUmangaUmagiliya Задайте отдельный вопрос для лучшего освещения. Не знаю, но думаю, что это важный вопрос. - person Jacek Laskowski; 23.04.2020