我不确定这是否是一个有效的问题,但我想问一下。
有没有办法我可以使用带有列名的列表并生成一个空的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模式,但是我提到的方法是不同的。我正在尝试从列表中生成架构。
答案 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|
+----+----+----+
+----+----+----+