如何创建一个空的DataFrame?为什么" ValueError:RDD为空"?

时间:2016-01-06 02:32:26

标签: apache-spark pyspark

我正在尝试在Spark(Pyspark)中创建一个空数据框。

我使用类似于此处讨论的方法enter link description here,但它不起作用。

这是我的代码

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

这是错误

    $.ajax({
        type: 'POST',
        contentType: "application/json; charset=utf-8",
        url: appControllerUrl + "/SaveAppDetails",
        data: {appDetails: JSON.stringify(appDetailsView.model)},
        processData: true,
        dataType: "json"
    });

10 个答案:

答案 0 :(得分:22)

扩展Joe Widen的answer,您实际上可以创建没有字段的架构:

schema = StructType([])

因此,当您使用该架构创建DataFrame时,您最终会得到DataFrame[]

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

在Scala中,如果您选择使用sqlContext.emptyDataFrame并查看架构,则会返回StructType()

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

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

答案 1 :(得分:8)

在撰写此答案时,您似乎需要某种架构

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

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

答案 2 :(得分:1)

您可以只使用以下内容:

   pivot_table = sparkSession.createDataFrame([("99","99")], ["col1","col2"])

答案 3 :(得分:1)

您可以在pyspark中使用以下语法创建一个空的数据框:

df = spark.createDataFrame([], ["col1", "col2", ...])

其中[]代表col1col2的空值。然后,您可以为SQL查询注册为临时视图:

**df2.createOrReplaceTempView("artist")**

答案 4 :(得分:1)

如果要基于现有的空数据框,则将简单行限制为0。 在PySpark中:

emptyDf = existingDf.limit(0)

答案 5 :(得分:0)

您可以通过加载空文件(parquetjson等)来执行此操作:

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

然后,当您尝试检查架构时,您会看到:

>>> df.printSchema()
root

在Scala / Java中,不传递路径也应该有效,在Python中它会引发异常。此外,如果您切换到Scala / Python,可以使用this method创建一个。

答案 6 :(得分:0)

spark.range(0).drop("id")

这将创建一个带有“ id”列且没有行的DataFrame,然后删除“ id”列,从而为您提供一个真正的空DataFrame。

答案 7 :(得分:0)

这是一种回旋但简单的方法,可以使用推断的模式创建空的Spark df

# Initialize a spark df using one row of data with the desired schema   
init_sdf = spark.createDataFrame([('a_string', 0, 0)], ['name', 'index', 'seq_#'])
# remove the row.  Leaves the schema
empty_sdf = init_sdf.where(col('name') == 'not_match')  
empty_sdf.printSchema()
# Output
root
 |-- name: string (nullable = true)
 |-- index: long (nullable = true)
 |-- seq_#: long (nullable = true)

答案 8 :(得分:0)

Seq.empty[String].toDF()

这将创建一个空的df。有助于测试目的和全部。 (斯卡拉火花)

答案 9 :(得分:0)

import pyspark
from pyspark.sql import SparkSession
from pyspark.sql.types import StructType,StructField, StringType

spark = SparkSession.builder.appName('SparkPractice').getOrCreate()

schema = StructType([
  StructField('firstname', StringType(), True),
  StructField('middlename', StringType(), True),
  StructField('lastname', StringType(), True)
  ])

df = spark.createDataFrame(spark.sparkContext.emptyRDD(),schema)
df.printSchema()