Scala dataframe.select,从文件中选择dataframe列

Scala dataframe.select,从文件中选择dataframe列,scala,apache-spark,apache-spark-sql,Scala,Apache Spark,Apache Spark Sql,我正在尝试从父数据帧创建子数据帧。但我有100多匹要选。 所以在Select语句中,我可以给出文件中的列吗 val Raw_input_schema=spark.read.format("text").option("header","true").option("delimiter","\t").load("/HEADER/part-00000").schema val Raw_input_data=spark.read.format("text").schema(Raw_input_sch

我正在尝试从父数据帧创建子数据帧。但我有100多匹要选。 所以在Select语句中,我可以给出文件中的列吗

val Raw_input_schema=spark.read.format("text").option("header","true").option("delimiter","\t").load("/HEADER/part-00000").schema

val Raw_input_data=spark.read.format("text").schema(Raw_input_schema).option("delimiter","\t").load("/DATA/part-00000")

val filtered_data = Raw_input_data.select(all_cols)

如何从所有列中的文件发送列名?我假设您从hdfs或共享配置文件的某个位置读取文件?原因是,在集群上,该代码将在单个节点上执行,等等

在这种情况下,我将使用下一个代码:

  import org.apache.spark.sql.functions.col
  val lines = Source.fromFile("somefile.name.csv").getLines

  val cols = lines.flatMap(_.split(",")).map( col(_)).toArray
  val df3 = df2.select(cols :_ *)

基本上,您只需提供字符串数组,并对可变数量的参数使用:*符号。

最后,这对我来说是可行的

val Raw_input_schema=spark.read.format("csv").option("header","true").option("delimiter","\t").load("headerFile").schema

val Raw_input_data=spark.read.format("csv").schema(Raw_input_schema).option("delimiter","\t").load("dataFile")

val filtered_file = sc.textFile("filter_columns_file").map(cols=>cols.split("\t")).flatMap(x=>x).collect().toList

//or

val filtered_file = sc.textFile(filterFile).map(cols=>cols.split("\t")).flatMap(x=>x).collect().toList.map(x => new Column(x))

val final_df=Raw_input_data.select(filtered_file.head, filtered_file.tail: _*)

//or

val final_df = Raw_input_data.select(filtered_file:_*)'

我使用sc.textFile从hdfs获取文件,在这种情况下我该怎么做。文件有一行,所有列都用制表符分隔\t,如col_1 col_2…按行分割以获得字符串数组,然后映射到col_以获得col列表,我认为,转换为数据帧列的数组是可选的,我这样做,但得到一个错误val lines=sc.textFile/header val cols=lines.map.split\t.mapcol.toArray,但在错误控制台下面>:36:错误:类型不匹配;找到:Array[String]required:String val cols=lines.map.split\t.mapcol^确保将从hdfs读取的内容展平到单行,看起来这就是此错误的含义