2016-01-06 27 views
6

Tôi đang cố tạo một khung dữ liệu trống trong Spark (Pyspark).Cách tạo DataFrame trống? Tại sao "ValueError: RDD trống"?

Tôi đang sử dụng cách tiếp cận tương tự với cách được thảo luận ở đây enter link description here, nhưng nó không hoạt động.

Đây là mã của tôi

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

Đây là lỗi

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 

Trả lời

11

mở rộng Joe Mở rộng của answer, bạn thực sự có thể tạo giản đồ không có các lĩnh vực như sau:

schema = StructType([]) 

vì vậy khi bạn tạo ra các DataFrame sử dụng đó như giản đồ của bạn, bạn sẽ kết thúc với một DataFrame[].

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

Trong Scala, nếu bạn chọn để sử dụng sqlContext.emptyDataFrame và kiểm tra các lược đồ, nó sẽ trở lại 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 phải có một giản đồ.

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

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

Ông có thể cung cấp một số nguồn chứng minh tuyên bố này? –

+0

Có vẻ như nó không thực sự cần thiết. Chỉ cần nhìn vào thông tin API cho createDataFrame và nó cho thấy mặc định lược đồ là không, vì vậy cần có một cách để tạo một khung dữ liệu không có lược đồ: https://spark.apache.org/docs/latest/api/ python/pyspark.sql.html –

0

Bạn có thể làm điều đó bằng cách tải một tập tin rỗng (parquet, json etc.) giống như này:

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

Sau đó, khi bạn cố gắng để kiểm tra sơ đồ bạn sẽ thấy:

>>> df.printSchema() 
root 

Trong Scala/Java không đi qua một đường dẫn cũng nên làm việc, trong Python nó ném một ngoại lệ. Ngoài ra nếu bạn chuyển sang Scala/Python, bạn có thể sử dụng this method để tạo một.

2

này sẽ làm việc với phiên bản spark 2.0.0 trở lên

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

phần nào của tính năng này chỉ hoạt động với 2.0 trở lên? nên làm việc trong quyền 1.6j @ braj259? – guimption

+0

phần intialization tia lửa. từ 2.0 trở đi chỉ có một ngữ cảnh tia lửa cho mọi thứ. vì vậy intialization là cú pháp ít khác nhau – braj259

+0

nhưng nếu bạn thay đổi 'sc = spark.sparkContext' thành' sc = sparkContext() 'thì tôi nghĩ nó phải tương thích với 1.6.x phải không? – guimption

Các vấn đề liên quan