带标头的Spark SQLContext查询

时间:2018-12-20 00:50:37

标签: apache-spark apache-spark-sql spark-csv

我正在使用SQLContext读取CSV文件,如下所示:

val csvContents = sqlContext.read.sql("SELECT * FROM 
                  csv.`src/test/resources/afile.csv` WHERE firstcolumn=21")

但是它将第一列打印为_c0,并在其下面包含标题。如何设置标题并使用SQL查询?我已经看到了此解决方案:

 val df = spark.read
         .option("header", "true") //reading the headers
         .csv("file.csv")

但是,这不允许我使用SELECT子句进行WHERE查询。是否可以指定CSV标头并进行SQL SELECT查询?

4 个答案:

答案 0 :(得分:1)

从数据框创建视图后,可以使用sql查询。像这样的东西。

val df = spark.read
  .option("header", "true") //reading the headers
  .csv("file.csv")

df.createOrReplaceTempView("table")

val sqlDf = spark.sql("SELECT * FROM table WHERE firstcolumn=21")

希望这会有所帮助。

答案 1 :(得分:0)

  
      
  1. 初始化SparkSession
  2.   
  3. val fileDF = spark.read.format(“ csv”)。option(“ header”,true).load(“ file.csv”)
  4.   
  5. 发布此信息,您可以访问列
  6.   
     import spark.implicits._  
     fileDF.select($"columnName").where(conditions)

答案 2 :(得分:0)

首先,如果您使用的是Spark 2.0,请稍后再尝试使用SparkSession代替SparkContext,如果列数较小,则建议使用

import org.apache.spark.sql.types._    
val schema = StructType(
  StructField("firstcolumn", StringType, true), 
  StructField("secondcolumn", IntegerType, true)
)

val df = spark.
  read.
  option("header", true).
  schema(schema).
  csv("file.csv")

因此您可以选择具有正确名称的列

val etl = df.select("firstcolumn").where("secondcolumn=0")

答案 3 :(得分:0)

事实证明标头未正确解析。 CSV文件以制表符分隔,因此我必须明确指定:

val csvContents = sqlContext.read
        .option("delimiter", "\t")
        .option("header", "true")
        .csv(csvPath)
        .select("*")
        .where(s"col_id=22")