header 的 Spark SQLContext 查询

Spark SQLContext Query with header

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

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

但它会将第一列打印为 _c0 并在其下包含 header。如何设置 header 并使用 SQL 查询?我见过这个解决方案:

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

但这不允许我使用 WHERE 子句执行 SELECT 查询。有没有办法指定 CSV header 并执行 SQL SELECT 查询?

您可以在从数据框创建视图后使用 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. Initialize SparkSession
  2. val fileDF = spark.read.format("csv").option("header",true).load("file.csv")
  3. Post this you can have access to columns
     import spark.implicits._  
     fileDF.select($"columnName").where(conditions)

首先,如果您正在使用 Spark 2.0 o 稍后尝试开始使用 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")

因此您可以select您的专栏使用正确的名称

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

事实证明 header 没有被正确解析。 CSV 文件是 tab-delimited 所以我必须明确指定:

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