SparkSQL - 直接读取镶木地板文件

时间:2016-12-21 02:03:20

标签: scala apache-spark hive apache-spark-sql hdfs

我正在从Impala迁移到SparkSQL,使用以下代码读取表:

my_data = sqlContext.read.parquet('hdfs://my_hdfs_path/my_db.db/my_table')

如何在上面调用SparkSQL,因此它可以返回类似于:

的内容
'select col_A, col_B from my_table'

4 个答案:

答案 0 :(得分:25)

从镶木地板文件创建Dataframe后,您必须将其注册为临时表以在其上运行sql queries

val sqlContext = new org.apache.spark.sql.SQLContext(sc)

val df = sqlContext.read.parquet("src/main/resources/peopleTwo.parquet")

df.printSchema

// after registering as a table you will be able to run sql queries
df.registerTempTable("people")

sqlContext.sql("select * from people").collect.foreach(println)

答案 1 :(得分:16)

使用纯SQL

可以在查询JSON,ORC,Parquet和CSV文件,而无需在Spark DataFrame上创建表格

//This Spark 2.x code you can do the same on sqlContext as well
val spark: SparkSession = SparkSession.builder.master("set_the_master").getOrCreate

spark.sql("select col_A, col_B from parquet.`hdfs://my_hdfs_path/my_db.db/my_table`")
   .show()

答案 2 :(得分:1)

假设您在HDFS中具有实木复合地板文件 ventas4

hdfs:// localhost:9000 / sistgestion / sql / ventas4

在这种情况下,步骤是:

  1. 收费SQL上下文:

    val sqlContext = new org.apache.spark.sql.SQLContext(sc)
    
  2. 读取实木复合地板文件:

    val ventas=sqlContext.read.parquet("hdfs://localhost:9000/sistgestion/sql/ventas4")
    
  3. 注册时间表:

    ventas.registerTempTable("ventas")
    
  4. 执行查询(在此行中,您可以使用toJSON传递JSON格式,也可以使用collect()):

    sqlContext.sql("select * from ventas").toJSON.foreach(println(_))
    
    sqlContext.sql("select * from ventas").collect().foreach(println(_))
    

答案 3 :(得分:0)

在intellij中使用以下代码:

def groupPlaylistIds(): Unit ={
    Logger.getLogger("org").setLevel(Level.ERROR)

    val spark = SparkSession.builder.appName("FollowCount")
      .master("local[*]")
      .getOrCreate()

    val sc = spark.sqlContext

    val d = sc.read.format("parquet").load("/Users/CCC/Downloads/pq/file1.parquet")
    d.printSchema()

    val d1 = d.select("col1").filter(x => x!='-')
    val d2 = d1.filter(col("col1").startsWith("searchcriteria"));
    d2.groupBy("col1").count().sort(col("count").desc).show(100, false)
  }