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

xuo3flqw  于 2021-07-14  发布在  Java
关注(0)|答案(2)|浏览(304)

我正在尝试从父Dataframe创建子Dataframe。但我有100多个Col可供选择。所以在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)

如何从文件中发送所有列的列名

zyfwsgd6

zyfwsgd61#

我假设您将从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 :_ *)

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

vshtjzan

vshtjzan2#

最后这对我起了作用;

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:_*)'

相关问题