2017-03-06 1 views
1

J'ai une colonne décimale "TOT_AMT" définie comme type "octets" et le type logique "décimal" dans mon schéma avro.Comment convertir les octets de colonne (avec le type logique en décimal) en Avro en décimal?

Après avoir créé la trame de données à l'aide d'étincelle databricks étincelle Avro, quand j'ai essayé de résumer la TOT_AMT colonne en utilisant la fonction somme, il jette « somme fonction requiert les types numériques ne binaryType » erreur.

La colonne est définie comme ci-dessous dans le schéma avro,

name = "TOT_AMT", "type": [ "null", { "type": "octets", "logicaltype": "décimale" , "précision": 20 "échelle": 10}]

Je crée dataframe et résumé comme,

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

Il semble que la valeur décimale est lue comme binaryType lors de la création dataframe. Dans un tel cas, comment pouvons-nous effectuer des opérations numériques sur ces colonnes décimales? Sera-t-il possible de convertir ce tableau d'octets en BigDecimal, puis d'effectuer des calculs.

+0

Pouvez-vous fournir un code ou un aperçu schématique de vos données? Surtout l'état de votre RDD actuel avant la réduction pourrait être important. La typographie explicite fera probablement l'affaire. – dennlinger

Répondre

0

Selon Supported types for Avro -> Spark SQL conversion, bytes de type Avro est converti en SQL Spark de BinaryType (voir aussi the code).

Selon the source code vous pouvez définir votre propre schéma personnalisé en utilisant l'option avroSchema, à savoir

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

Cela vous donne le moyen de spécifier le mappage de BinaryType à Decimal.

Vous pouvez également utiliser la fonction cast pour convertir une valeur binaire en son format décimal.

p.s. Je ne sais pas si le lecteur supporte logicaltype indices définis dans un schéma Avro. Ce serait bien d'avoir une telle fonctionnalité si elle n'est pas disponible actuellement.