【问题标题】:dataframe.select, select dataframe columns from filedataframe.select,从文件中选择数据框列
【发布时间】:2019-02-22 20:10:32
【问题描述】:

我正在尝试从父数据框创建子数据框。但我有 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)

如何从 all_cols 中的文件发送列名

【问题讨论】:

    标签: scala apache-spark apache-spark-sql


    【解决方案1】:

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

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

    【讨论】:

    • 我正在使用 sc.textFile 从 hdfs 获取文件,在这种情况下我该怎么做。文件只有一行,所有列都由制表符“\t”分隔,如 col_1 col_2 ...
    • 通过 "\t" 分割行以获取字符串数组,然后映射到 col(_) 以获取 cols 列表,我认为,转换为数据框列的数组是可选的
    • 我这样做但得到一个错误 val lines = sc.textFile("/header") val cols =lines.map(.split("\t")).map (col()).toArray 但低于错误控制台>:36:错误:类型不匹配;找到:需要数组 [字符串]:字符串 val cols = lines.map(.split("\t")).map(col()) ^
    • 确保你已经将你从 hdfs 读取的内容扁平化为单行,看起来这就是这个错误的意思
    【解决方案2】:

    最后这对我有用;

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

    【讨论】:

      猜你喜欢
      • 2018-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-25
      • 1970-01-01
      • 2019-03-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多