我正在使用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
查询?
答案 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)
- 初始化SparkSession
- val fileDF = spark.read.format(“ csv”)。option(“ header”,true).load(“ file.csv”)
- 发布此信息,您可以访问列
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")