我来自pandas背景,用于将CSV文件中的数据读入数据帧,然后使用简单命令将列名更改为有用的内容:
df.columns = new_column_name_list
但是,在使用sqlContext创建的pyspark数据帧中,这同样不起作用 . 我可以轻松解决的唯一解决方案如下:
df = sqlContext.read.format("com.databricks.spark.csv").options(header='false', inferschema='true', delimiter='\t').load("data.txt")
oldSchema = df.schema
for i,k in enumerate(oldSchema.fields):
k.name = new_column_name_list[i]
df = sqlContext.read.format("com.databricks.spark.csv").options(header='false', delimiter='\t').load("data.txt", schema=oldSchema)
这基本上是定义变量两次并首先推断模式然后重命名列名,然后再次使用更新的模式加载数据帧 .
像熊猫一样,是否有更好,更有效的方法来做到这一点?
我的火花版是1.5.0
10 回答
使用这种方式的优点:使用长列列表,您只想更改几个列名称 . 在这些情况下,这可能非常方便 . 连接具有重复列名称的表时非常有用 .
我用这个:
这是我使用的方法:
创建pyspark会话:
创建数据帧:
使用列名查看df:
创建一个包含新列名的列表:
更改df的列名:
使用新列名查看df:
如果您想对所有列名称应用简单转换,此代码可以解决这个问题:(我用下划线替换所有空格)
感谢@ user8117731的
toDf
技巧 .有很多方法可以做到这一点:
DataFrames
上使用SQL查询作为表注册 .对于单列重命名,您仍然可以使用toDF() . 例如,
如果要重命名单个列并保持其余原样:
如果要更改所有列名称,请尝试
df.toDF(*cols)
另一种只重命名一列的方法(使用
import pyspark.sql.functions as F
):df.withColumnRenamed('age', 'age2')