Avro файлы, созданные с использованием Spark и имеющие поля DecimalType - PullRequest
1 голос
/ 14 июня 2019

Я создал файлы данных Avro с использованием spark2, а затем определил таблицу кустов, указывающую на файлы данных avro.

val trades= spark.read.option("compression","gzip").csv("file:///data/nyse_all/nyse_data").select($"_c0".as("stockticker"),$"_c1".as("tradedate").cast(IntegerType),$"_c2".as("openprice").cast(DataTypes.createDecimalType(10,2)),$"_c3".as("highprice").cast(DataTypes.createDecimalType(10,2)),$"_c4".as("lowprice").cast(DataTypes.createDecimalType(10,2)),$"_c5".as("closeprice").cast(DataTypes.createDecimalType(10,2)),$"_c6".as("volume").cast(LongType))    
trades.repartition(4,$"tradedate",$"volume").sortWithinPartitions($"tradedate".asc,$"volume".desc).write.format("com.databricks.spark.avro").save("/user/pawinder/spark_practice/problem6/data/nyse_data_avro")

spark.sql("create external table pawinder.nyse_data_avro(stockticker string, tradedate int, openprice decimal(10,2) , highprice decimal(10,2), lowprice decimal(10,2), closeprice decimal(10,2), volume bigint) ROW FORMAT SERDE  'org.apache.hadoop.hive.serde2.avro.AvroSerDe'  STORED AS INPUTFORMAT  'org.apache.hadoop.hive.ql.io.avro.AvroContainerInputFormat'  OUTPUTFORMAT  'org.apache.hadoop.hive.ql.io.avro.AvroContainerOutputFormat' location '/user/pawinder/spark_practice/problem6/data/nyse_data_avro'")

Запрос к таблице кустов завершается ошибкой:

Ошибка: java.lang.RuntimeException: org.apache.hadoop.hive.ql.metadata.HiveException: ошибка времени выполнения Hive во время обработки записи org.apache.hadoop.hive.serde2.avro.AvroGenericRecordWritable@178270b2 в org.apache.hadoop.hive.ql.exec.mr.ExecMapper.map (ExecMapper.java:172) в org.apache.hadoop.mapred.MapRunner.run (MapRunner.java:54) в org.apache.hadoop.mapred.MapTask.runOldMapper (MapTask.java:453) на org.apache.hadoop.mapred.MapTask.run (MapTask.java:343) в org.apache.hadoop.mapred.YarnChild $ 2.run (YarnChild.java:170) at java.security.AccessController.doPrivileged (собственный метод) в javax.security.auth.Subject.doAs (Subject.java:422) в org.apache.hadoop.security.UserGroupInformation.doAs (UserGroupInformation.java:1869) at org.apache.hadoop.mapred.YarnChild.main (YarnChild.java:164) Причина: org.apache.hadoop.hive.ql.metadata.HiveException: Hive Ошибка выполнения при обработке записи org.apache.hadoop.hive.serde2.avro.AvroGenericRecordWritable@178270b2 в org.apache.hadoop.hive.ql.exec.MapOperator.process (MapOperator.java:563) в org.apache.hadoop.hive.ql.exec.mr.ExecMapper.map (ExecMapper.java:163) ... еще 8 Вызвано: org.apache.avro.AvroTypeException: найдена строка, ожидающая объединения

При некоторой отладке я обнаружил, что типы данных, которые были определены как десятичные (10,2), помечены как строки в файлах данных avro:

 [pawinder@gw02 ~]$ hdfs dfs -cat /user/pawinder/spark_practice/problem6/data/nyse_data_avro/part-00003-f1ca3b0a-f0b4-4aa8-bc26-ca50a0a16fe3-c000.avro |more
    Objavro.schema▒{"type":"record","name":"topLevelRecord","fields":[{"name":"stockticker","type":["string","null"]},{"name":"tradedate","type":["int","null"]},{"name":"o
    penprice","type":["string","null"]},{"name":"highprice","type":["string","null"]},{"name":"lowprice","type":["string","null"]},{"name":"closeprice","type":["string","n
    ull"]},{"name":"volume","type":["long","null"]}]}

Я могу запросить ту же таблицу кустов в spark-shell. Avro serde не распознает спарк-sql DecimalType? Я использую спарк 2.3.

...