2017-01-13 155 views
1

我在HDFS中有2个文件 - 一个是没有标题的csv文件,一个是列名称列表。我想知道是否可以将列名分配给其他数据框,而不需要像描述的here那样输入它们。Spark重命名数据框列

我正在寻找这样的事情:

val df = sqlContext.read.format("com.databricks.spark.csv").option("delimiter", "\t").load("/user/training_data.txt") 
val header = sqlContext.read.format("com.databricks.spark.csv").option("delimiter", ",").load("/user/col_names.txt") 

df.columns(header) 

这可能吗?

回答

2

一种方法可以读取使用scala.io这样的头文件:

import scala.io.Source 
val header = Source.fromFile("/user/col_names.txt").getLines.map(_.split(",")) 
val newNames = header.next 

然后,阅读使用spark-csv为你做的CSV文件,指定没有头和转换的名字,如:

val df = spark.read.format("com.databricks.spark.csv") 
     .option("header", "false").option("delimiter", "\t") 
     .load("/user/training_data.txt").toDF(newNames: _*) 

注意_*型注释。

的_ *是Scala类型归属(这意味着我们可以给一个列表作为参数,它仍然可以工作,将相同的功能的,说列表中的每个成员)

更多在这里:What is the purpose of type ascriptions in Scala?