【问题标题】:Generate empty spark DF provided a list with column names生成空 spark DF 提供了一个包含列名的列表
【发布时间】:2019-02-22 08:30:26
【问题描述】:

我不确定这是否是一个有效的问题,但我想问一下。

有没有一种方法可以使用带有列名的列表并生成一个空的 spark 数据框,应该使用列表中的元素创建架构,所有列的数据类型为 StringType。

例如:

column_names = "ColA|ColB|ColC"

def Convert(string):
    li = list(string.split("|"))
    return li

schema_names = Convert(column_names)

#schema_names = ['ColA', 'ColB', 'ColC']

我如何使用这个列表来创建一个 DF Schema 或一个空的 DF

**这有点类似于 How to create an empty DataFrame with a specified schema? ,因为我也在尝试创建空的 DF 模式,但我提到的方法不同。我正在尝试从列表中生成架构。

【问题讨论】:

标签: apache-spark pyspark apache-spark-sql


【解决方案1】:

我有一个肮脏的解决方案。可能不是最好的:

column_names = "ColA|ColB|ColC"

df = spark.createDataFrame(
  [
    tuple('' for i in column_names.split("|"))
  ],
  column_names.split("|")
).where("1=0")

df.show()

+----+----+----+
|ColA|ColB|ColC|
+----+----+----+
+----+----+----+

【讨论】:

  • 有没有办法可以将此模式用于其他数据帧?我实际上是在尝试动态创建数据框模式,以便我可以映射到我的 DF
  • 当然。 spark.createDataframe( [some_data], df.schema)
  • 出错了..TypeError: schema should be StructType or list or None, but got: DataFrame
  • 你可能做错了什么,因为 df.schema 不是数据框。它是结构类型。
  • 是的,我传递的是 df,而不是 df.schema
【解决方案2】:

由于您希望所有列都为StringType(),请按如下方式定义架构:

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

column_names = "ColA|ColB|ColC"
mySchema = StructType([StructField(c, StringType()) for c in column_names.split("|")])

现在只需将一个空列表作为数据连同此架构一起传递给spark.createDataFrame()

df = spark.createDataFrame(data=[], schema=mySchema)
df.show()
#+----+----+----+
#|ColA|ColB|ColC|
#+----+----+----+
#+----+----+----+

现在您也可以将此架构重用于其他 DataFrame。

【讨论】:

    【解决方案3】:

    在 Scala 中:

    val columns = List("ColA", "ColB", "ColC")
    val result = columns.foldLeft(spark.emptyDataFrame)((a, b) => a.withColumn(b, lit("anyStringValue")))
    result.printSchema()
    result.show(false)
    

    输出:

    root
     |-- ColA: string (nullable = false)
     |-- ColB: string (nullable = false)
     |-- ColC: string (nullable = false)
    
    +----+----+----+
    |ColA|ColB|ColC|
    +----+----+----+
    +----+----+----+
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-13
      • 2021-10-26
      • 2017-12-06
      • 2021-12-17
      • 1970-01-01
      • 2020-06-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多