Spark SQLContext Query с заголовком - PullRequest
       39

Spark SQLContext Query с заголовком

0 голосов
/ 20 декабря 2018

Я использую 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 голосов
/ 22 декабря 2018

Оказывается, заголовок не был проанализирован правильно.Файл CSV был разделен табуляцией, поэтому мне пришлось явно указать, что:

val csvContents = sqlContext.read
        .option("delimiter", "\t")
        .option("header", "true")
        .csv(csvPath)
        .select("*")
        .where(s"col_id=22")
0 голосов
/ 20 декабря 2018
  1. Инициализация SparkSession
  2. val fileDF = spark.read.format ("csv"). Option ("header", true) .load ("file.csv")
  3. Опубликовать это вы можете иметь доступ к столбцам
     import spark.implicits._  
     fileDF.select($"columnName").where(conditions)
0 голосов
/ 21 декабря 2018

Сначала Если вы работаете с 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")
0 голосов
/ 20 декабря 2018

Вы можете использовать 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")

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...