下面的 Dataframe 是一个名为‘TABLE_NAME’的临时表。
您将如何使用spak.sql()为所有列添加前缀?
root
|-- MAIN_COL: struct (nullable = true)
| |-- a: string (nullable = true)
| |-- b: string (nullable = true)
| |-- c: string (nullable = true)
| |-- d: string (nullable = true)
| |-- f: long (nullable = true)
| |-- g: long (nullable = true)
| |-- h: long (nullable = true)
| |-- j: long (nullable = true)
下面的查询
spark.sql("select MAIN_COL.* from table_name")
返回名为a、b、c的列,但如何使它们看起来都像prea、preb、prec?
希望避免逐一选择和给他们指定别名。如果我有30列呢?
我希望一个自定义的UDF可以解决这个问题,在SQL中使用,但真的不确定如何处理这个问题。
# Generate a pandas DataFrame
import pandas as pd
a_dict={
'a':[1,2,3,4,5],
'b':[1,2,3,4,5],
'c':[1,2,3,4,5],
'e':list('abcde'),
'f':list('abcde'),
'g':list('abcde')
}
pandas_df=pd.DataFrame(a_dict)
# Create a Spark DataFrame from a pandas DataFrame using Arrow
spark.conf.set("spark.sql.execution.arrow.enabled", "true")
df = spark.createDataFrame(pandas_df)
# struct
from pyspark.sql.functions import struct
main=df.select(struct(df.columns).alias("MAIN_COL"))
5条答案
按热度按时间dwbf0jvd1#
这里有一种方法可以遍历这些字段并动态修改它们的名称。首先使用
main.schema.fields[0].dataType.fields
访问目标字段。接下来,使用pythonmap
将pre_
添加到每个字段:最后,您可以将
cast
与@Mahesh已经提到的新模式一起使用。x6yk4ghg2#
Spark的美丽,您可以通过编程操作元数据
这是一个继续原始代码片段的示例:
由于Spark的懒惰,并且因为所有操作都只是元数据,所以该代码几乎没有任何性能成本,并且对于10列或500列也同样有效(我们实际上正在对1k的列执行类似的操作)。
还可以使用
df.schema
对象以更优雅方式获取原始列名fwzugrvs3#
您可以尝试这样做:根据需要将所有列添加到方案2
现在使用LIKE选择列:
它将为您提供所有更新的列名。
jjhzyzn04#
下面的展开所有结构列添加父列名称作为前缀。
测试输入:
结果:
zpgglvta5#
您也可以使用PySpark执行此操作: