使用PySpark在Spark DataFrame中将嵌套结构列重命名为小写

时间:2020-06-08 11:02:15

标签: python pyspark pyspark-dataframes

使用scala已经可以使用类似的解决方案,但是我需要在pyspark中使用一种解决方案。我是python的新手,需要您的所有帮助。

下面是scala解决方案的链接,以便更好地了解需求。

Rename nested struct columns in a Spark DataFrame

我正在尝试在python中更改DataFrame列的名称。我可以轻松更改直接字段的列名,但是在转换数组结构列时遇到困难。

下面是我的DataFrame模式。

|-- VkjLmnVop: string (nullable = true)
|-- KaTasLop: string (nullable = true)
|-- AbcDef: struct (nullable = true)
 |    |-- UvwXyz: struct (nullable = true)
 |    |    |-- MnoPqrstUv: string (nullable = true)
 |    |    |-- ManDevyIxyz: string (nullable = true)

但是我需要下面的模式

|-- vkjlmnvop: string (nullable = true)
|-- kataslop: string (nullable = true)
|-- abcdef: struct (nullable = true)
 |    |-- uvwxyz: struct (nullable = true)
 |    |    |-- mnopqrstuv: string (nullable = true)
 |    |    |-- mandevyixyz: string (nullable = true)

如何动态更改Struct列名?

2 个答案:

答案 0 :(得分:2)

我想这就是您想要的。希望能帮助到你!

ICommand

答案 1 :(得分:2)

我还发现了行数少的类似逻辑的另一种解决方案。

import pyspark.sql.functions as spf
ds = {'AbcDef': {'UvwXyz': {'VkjLmnVop': 'abcd'}}, 'HijKS': 'fgds'}
df = spark.read.json(sc.parallelize([ds]))
df.printSchema()
"""
root
 |-- AbcDef: struct (nullable = true)
 |    |-- UvwXyz: struct (nullable = true)
 |    |    |-- VkjLmnVop: string (nullable = true)
 |-- HijKS: string (nullable = true)
"""
for i in df.columns : df = df.withColumnRenamed(i, i.lower()) 
schemaDef = [y.replace("]","") for y in [x.replace("DataFrame[","") for x in df.__str__().split(", ")]]

for j in schemaDef :
  columnName = j.split(": ")[0]
  dataType = j.split(": ")[1]
  df = df.withColumn(columnName, spf.col(columnName).cast(dataType.lower())) 

df.printSchema()

"""
root
 |-- abcdef: struct (nullable = true)
 |    |-- uvwxyz: struct (nullable = true)
 |    |    |-- vkjlmnvop: string (nullable = true)
 |-- hijks: string (nullable = true)
"""