我来自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)
这基本上是定义两次变量,首先推断模式,然后重命名列名,然后用更新的模式再次加载数据帧。
有没有更好更有效的方法像我们在熊猫身上做的那样?
我的spark版本是1.5.0
使用这种方法的优点:对于长列列表,您只需要更改很少的列名。在这些情况下,这非常方便。当使用重复的列名连接表时非常有用。
有很多方法可以做到这一点:
选择1。使用selectExpr。
选择2。使用withColumnRenamed,注意这个方法允许您“覆盖”同一列。
选择3。使用 alias,在Scala中也可以使用as。
选择4。使用sqlContext.sql,这允许您对注册为表的
DataFrames
使用SQL查询。如果要更改所有列名,请尝试
df.toDF(*cols)
相关问题 更多 >
编程相关推荐