【问题标题】:How to create an empty DataFrame? Why "ValueError: RDD is empty"?如何创建一个空的DataFrame?为什么“ValueError:RDD 为空”?
【发布时间】:2016-04-10 01:04:41
【问题描述】:

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

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

这是我的代码

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

这是错误

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

【问题讨论】:

    标签: apache-spark pyspark


    【解决方案1】:

    扩展 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()    
    

    【讨论】:

      【解决方案2】:

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

      from pyspark.sql.types import *
      field = [StructField("field1", StringType(), True)]
      schema = StructType(field)
      
      sc = spark.sparkContext
      sqlContext.createDataFrame(sc.emptyRDD(), schema)
      

      【讨论】:

      • 你能提供一些证明这个说法的来源吗?
      • 看起来其实没必要。刚刚查看了 createDataFrame 的 API 信息,它显示架构默认为无,因此应该有一种方法可以创建没有架构的数据框:spark.apache.org/docs/latest/api/python/pyspark.sql.html
      【解决方案3】:

      这适用于 spark 2.0.0 或更高版本

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

      【讨论】:

      • 这部分内容仅适用于 2.0 或更高版本?应该在 1.6.1 中工作吗@braj259?
      • 火花初始化部分。从 2.0 开始,所有内容都只有一个 spark 上下文。所以初始化在语法上几乎没有什么不同
      • 但是如果你把sc = spark.sparkContext改成sc = sparkContext()那么我认为它应该与1.6.x兼容吧?
      【解决方案4】:
      spark.range(0).drop("id")
      

      这会创建一个带有“id”列且没有行的 DataFrame,然后删除“id”列,留下一个真正空的 DataFrame。

      【讨论】:

        【解决方案5】:

        你可以使用这样的东西:

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

        【讨论】:

          【解决方案6】:
          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()
          

          【讨论】:

            【解决方案7】:

            这是一种使用推断架构创建空 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】:
              Seq.empty[String].toDF()
              

              这将创建一个空的df。有助于测试目的和所有。 (Scala-Spark)

              【讨论】:

                【解决方案9】:

                如果您想要基于现有数据框的空数据框,只需将行数限制为 0。 在 PySpark 中:

                emptyDf = existingDf.limit(0)
                

                【讨论】:

                  【解决方案10】:

                  在 Spark 3.1.2 中,spark.sparkContext.emptyRDD() 函数会引发错误。使用schema,传递一个空列表将起作用:

                  df = spark.createDataFrame([], schema)
                  

                  【讨论】:

                    【解决方案11】:

                    您可以通过加载一个空文件(parquetjson 等)来实现,如下所示:

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

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

                    >>> df.printSchema()
                    root
                    

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

                    【讨论】:

                      【解决方案12】:

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

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

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

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

                      【讨论】:

                      • 它说“无法从空数据框推断架构”
                      猜你喜欢
                      • 2018-04-05
                      • 2015-10-22
                      • 1970-01-01
                      • 1970-01-01
                      • 2020-01-18
                      • 2019-05-28
                      • 1970-01-01
                      • 2021-02-03
                      • 2021-08-09
                      相关资源
                      最近更新 更多