代码之家  ›  专栏  ›  技术社区  ›  Evan Zamir

在没有标头或架构的数据上编写sparksql查询

  •  -1
  • Evan Zamir  · 技术社区  · 6 年前

    我想编写一个通用脚本,可以在没有头或预定义模式的文件上运行SQL查询。例如,文件可能看起来像:

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

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

    ?? .

    2 回复  |  直到 6 年前
        1
  •  2
  •   Karthick    6 年前

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

    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 |  
    |  .. | ... |  
    +-----+-----+
    

    这样就可以在sparksql中填充列名。

        2
  •  0
  •   ryandam    6 年前

    默认模式似乎有列名 _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")