2017-01-12 7 views
1

Probleme beim Erstellen von zwei Datenrahmen und eine union auf ihnen tun.Erstellen eines Spark-Datenrahmens

Dies funktioniert:

a = [{'letter':'a'}] 
sqlContext.createDataFrame(a).collect() 
b = [{'letter':'b'}] 
sqlContext.createDataFrame(b).collect() 

Aber wenn ich rdd = sc.union([a,b]) laufen, bekomme ich AttributeError: 'list' object has no attribute '_jrdd_deserializer'

Also dachte ich, ich brauche sc.parallelize() zu tun. Ich bin mir nicht 100% sicher, was das bedeutet, auch nachdem ich die Dokumentation gelesen habe. Kann jemand diese Funktion auf hohem Niveau erklären?

Also habe ich:

a = sc.parallelize(['a']) 
sqlContext.createDataFrame(a).collect() 

aber ich habe noch einen Fehler, diesmal: TypeError: Can not infer schema for type: <type 'str'>

Ich versuche nur, all die Syntax zu verstehen und die Typen und Funktionen benötigt, um einfach zu erstellen 2 Datenrahmen und verbinden sie.

Antwort

3

In Ihrem ersten Ansatz haben Sie keine RDDs/DataFrames erstellt, also versucht sc.union([a, b]) zwei Listen zu verbinden, nicht RDDs oder DataFrames, daher erhalten Sie AttributeError: 'list' object has no attribute '_jrdd_deserializer'.

Hier ist ein Ausschnitt, wenn Sie auf Datenrahmen mit dem Ausgang Alternativ

[Row(letter=u'a'), Row(letter=u'b')] 

a = [{'letter':'a'}] 
b = [{'letter':'b'}] 

a_df = sqlContext.createDataFrame(a) 
b_df = sqlContext.createDataFrame(b) 

a_df.unionAll(b_df).collect() 

betreiben wollen, würde RDD Operationen

r = sc.union([ 
     sc.parallelize([e['letter'] for e in a]), 
     sc.parallelize([e['letter'] for e in b]), 
    ]) 

r.collect() 

mit dem Ausgang

sein
['a', 'b'] 
+0

Danke, also sieht es so aus, als hätte ich 3 Dinge falsch gemacht: nicht den 'createDataFrame' einer Variablen zuzuweisen, mit der' collect() 'Methode und der 'union' Syntax. Oder ist die "sc.union" noch eine praktikable Methode? – simplycoding

+0

'sc.union' ist immer noch eine gute Methode, wenn Sie mit RDDs arbeiten. Du könntest einfach diese 'sc.union ([sc.parallelize (a), sc.parallelize (b)]). Collect()' (beachte die 'sc.parallelize (...)') für ein '[{ 'Buchstabe': 'a'}, {'Buchstabe': 'b'}] 'Ausgabe. – TDrabas