2017-10-16 1 views
0

Je suis coincé dans la conversion des données avro en GenericRecord/ByteArray où j'ai surfé sur google, ce qui me donne la solution inverse. Est-ce que quelqu'un a essayé de convertir AVRO RDD/Dataframes en GenericRecord ou ByteArray en scala? J'ai utilisé cette commande pour lire mes fichiers avro.Comment convertir des données de avro en GenericRecord en scala

spark.read.avro("/app/q.avro") 

Il me renvoie des données comme ceci.

res0: org.apache.spark.sql.DataFrame = [recordType: string, recordVersion: string ... 6 more fields] 

Alors Comment convertir sql.DataFrame en GenericRecord/ByteArray?

+0

Pourquoi est-ce que vous voulez convertir Daraframe à un autre objet? Je pense qu'il devrait être rangée à Bytearray pas entière de données. –

+0

ouais ... Row à ByteArray est aussi bien pour moi ... –

Répondre

0

Après avoir créé un dataframe:

val df=spark.read.avro("/app/q.avro") 

Vous pouvez le convertir en soit un RDD ou une liste de chaînes.

val listOfStrings=df.rdd.collect.toList 

Maintenant, vous pouvez convertir la liste des chaînes en byteArray, comme ceci:

scala> var lst=List("scala","Java","Python","JavaScript") 
lst: List[String] = List(scala, Java, Python, JavaScript) 

scala> lst.map(_.getBytes).toArray 
res5: Array[Array[Byte]] = Array(Array(115, 99, 97, 108, 97), Array(74, 97, 118, 97), Array(80, 121, 116, 104, 111, 110), Array(74, 97, 118, 97, 83, 99, 114, 105, 112, 116)) 
+0

Quand je lis le fichier avro, le type de df est "org.apache.spark.sql.DataFrame" df.rdd.toList me jette une erreur ... "error: value toList n'est pas membre de org.apache.spark.rdd.RDD [org.apache.spark.sql.Row]" –

+0

listOfStrings: org.apache.spark.rdd.RDD [org.apache.spark. sql.Row] = MapPartitionsRDD [15] à rdd à : 28 –

+0

ouais obtenu le résultat, mais seulement pour r (0) .. pas pour l'ensemble du RDD ... –