生成空的Spark DF,提供带有列名称的列表

时间:2018-09-18 10:16:04

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

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

有没有办法我可以使用带有列名的列表并生成一个空的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模式或空DF

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

3 个答案:

答案 0 :(得分:2)

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

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|
+----+----+----+
+----+----+----+

答案 1 :(得分: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。

答案 2 :(得分:1)

在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|
+----+----+----+
+----+----+----+