2016-01-06 15 views
6

Próbuję utworzyć pustą ramkę danych w Spark (Pyspark).Jak utworzyć pustą ramkę DataFrame? Dlaczego "ValueError: RDD jest pusty"?

Używam podobnego podejścia do omawianego tutaj enter link description here, ale to nie działa.

To jest mój kod

df = sqlContext.createDataFrame(sc.emptyRDD(), schema) 

Jest to błąd

Traceback (most recent call last): 
File "<stdin>", line 1, in <module> 
File "/Users/Me/Desktop/spark-1.5.1-bin-hadoop2.6/python/pyspark/sql/context.py", line 404, in createDataFrame 
rdd, schema = self._createFromRDD(data, schema, samplingRatio) 
File "/Users/Me/Desktop/spark-1.5.1-bin-hadoop2.6/python/pyspark/sql/context.py", line 285, in _createFromRDD 
struct = self._inferSchema(rdd, samplingRatio) 
File "/Users/Me/Desktop/spark-1.5.1-bin-hadoop2.6/python/pyspark/sql/context.py", line 229, in _inferSchema 
first = rdd.first() 
File "/Users/Me/Desktop/spark-1.5.1-bin-hadoop2.6/python/pyspark/rdd.py", line 1320, in first 
raise ValueError("RDD is empty") 
ValueError: RDD is empty 

Odpowiedz

11

rozszerzenie Joe Poszerz na answer, rzeczywiście można stworzyć schemat bez pola tak:

schema = StructType([]) 

więc podczas tworzenia DataFrame używając jej jako schematu, będziesz skończyć z DataFrame[].

>>> empty = sqlContext.createDataFrame(sc.emptyRDD(), schema) 
DataFrame[] 
>>> empty.schema 
StructType(List()) 

w Scala, jeśli zdecydujesz się skorzystać sqlContext.emptyDataFrame i sprawdzić schemat, zwróci StructType().

scala> val empty = sqlContext.emptyDataFrame 
empty: org.apache.spark.sql.DataFrame = [] 

scala> empty.schema 
res2: org.apache.spark.sql.types.StructType = StructType()  
3

Dataframes musi mieć schemat.

from pyspark.sql.types import * 
field = [StructField("field1", StringType(), True)] 
schema = StructType(field) 

sqlContext.createDataFrame(sc.emptyRDD(), schema) 
+0

mógłbyś podać jakieś źródło udowodnienia tego twierdzenia? –

+0

Wygląda na to, że nie jest to konieczne. Po prostu przyjrzeliśmy się informacjom API dla createDataFrame i pokazuje domyślne schematy dla none, więc powinien istnieć sposób na stworzenie ramek danych bez schematu: https://spark.apache.org/docs/latest/api/ python/pyspark.sql.html –

0

Można to zrobić poprzez załadowanie pusty plik (parquet, json etc.) tak:

df = sqlContext.read.json("my_empty_file.json") 

Następnie przy próbie sprawdzenia schematu zobaczysz:

>>> df.printSchema() 
root 

W Scala/Java nie przekazanie ścieżki powinno również działać, w Pythonie zgłasza wyjątek. Jeśli kiedykolwiek zmienisz Scala/Python, możesz użyć this method, aby go utworzyć.

2

to będzie działać z wersją 2.0.0 iskra lub więcej

from pyspark.sql import SQLContext 
sc = spark.sparkContext 
schema = StructType([StructField('col1', StringType(), False),StructField('col2', IntegerType(), True)]) 
sqlContext.createDataFrame(sc.emptyRDD(), schema) 
+0

jaka część tego działa tylko dla wersji 2.0 lub więcej? powinien działać w 1.6.1 right @ braj259? – guimption

+0

część intryzacji iskry. od 2.0 jest tylko jeden kontekst iskier dla wszystkiego. więc intializacja jest składniowo mało różna – braj259

+0

, ale jeśli zmienisz 'sc = spark.sparkContext' na' sc = sparkContext() 'to myślę, że to powinno być zgodne z 1.6.x, prawda? – guimption

Powiązane problemy