在没有标题或架构的数据上编写Spark SQL查询

时间:2018-09-27 23:34:33

标签: apache-spark apache-spark-sql

我想编写一个通用脚本,该脚本可以对没有标题或预定义架构的文件运行SQL查询。例如,文件可能如下所示:

Bob,32
Alice, 24
Jane,65
Doug,33
Peter,19

SQL查询可能是:

SELECT COUNT(DISTINCT ??) 
FROM temp_table
WHERE ?? > 32

我想知道在??中放什么。

2 个答案:

答案 0 :(得分:2)

您可以在阅读时定义“自定义模式”

val schema = StructType(
  StructField("field1", StringType, true) ::
    StructField("field2", IntegerType, true) :: Nil
) 

val df = spark.read.format("csv")
    .option("sep", ",")
    .option("header", "false")
    .schema(schema)
    .load("examples/src/main/resources/people.csv")

您还可以忽略以默认名称(非首选)结尾的模式部分

 val df = spark.read.format("csv")
     .option("sep", ",")
     .option("header", "false")
     .load("examples/src/main/resources/people.csv")

+-----+-----+
|  _c0|  _c1|
+-----+-----+
|  Bob|  32 |  
|  .. | ... |  
+-----+-----+

,您可以在spark-sql中填写列名称。

答案 1 :(得分:0)

似乎默认架构具有列名_c0_c1等。

val df = spark.read.format("csv").load("test.txt")

scala> df.printSchema
root
  |-- _c0: string (nullable = true)
  |-- _c1: string (nullable = true)

在Spark 2.0中,

  df.createOrReplaceTempView("temp_table")
  spark.sql("SELECT COUNT(DISTINCT _c1) FROM temp_table WHERE cast(_c1 as int) > 32")