Как прочитать десятичный логический тип в искровом фрейме данных

У меня есть файл Avro, содержащий следующий десятичный логический тип:

"type":["null",{"type":"bytes","logicalType":"decimal","precision":19,"scale":2}]


когда я пытаюсь прочитать файл с библиотекой scala spark, схема df

MyField: binary (nullable = true)


Как я могу преобразовать его в десятичный тип?


person Mauro Midolo    schedule 16.11.2018    source источник


Ответы (1)


Вы можете указать схему в операции чтения:

val schema = new StructType()
    .add(StructField("MyField", BooleanType))

или вы можете бросить столбец

val binToInt: String => Integer = Integer.ParseInt(_, 2);
val binToIntegerUdf = udf(binToInt);

df.withColumn("Myfield", binToIntegerUdf(col("MyField").cast("string")))
person hamza tuna    schedule 16.11.2018
comment
решение приведения вызывает следующую ошибку: невозможно разрешить «CAST (MyField AS DECIMAL (10,0))» из-за несоответствия типа данных: невозможно преобразовать двоичный код в десятичный (10,0); - person Mauro Midolo; 16.11.2018
comment
Обновлено. Вы можете написать свою собственную функцию для этого и сохранить ее как udf. - person hamza tuna; 16.11.2018
comment
Это решение не работает. binary нельзя превратить cast в decimal. Приведение его к string преобразует базовый Array[Byte] в String. Он не возвращает строковое представление десятичного числа. - person Nicus; 16.10.2019