2016-12-21 13 views
5

Bir masa okumak için aşağıdaki kodu kullanarak, SparkSQL için Impala geçiş ediyorum: Nasıl SparkSQL yukarıda çağırmakSparkSQL - parke dosyasını oku doğrudan

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

, bu yüzden böyle bir şey dönebilirsiniz:

'select col_A, col_B from my_table' 

cevap

4

Parke dosyasından bir Dataframe oluşturduktan sonra, üzerine sql queries kodunu çalıştırmak için geçici tablo olarak kaydetmeniz gerekir.

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) 
+0

Gerekli (ya da iyi bir fikir) gerekli mi? Çünkü eğer veriler büyükse, her şeyi sürücüye toplamak istemiyoruz. – Edamame

+1

sadece bir örnek nasıl sql kullanılabilir. Nasıl kullanmak istediğine bağlı. Sorguyu değiştirebilir veya .0 ( –

5

Biz tablo oluşturmadan JSON, ORC, Parke ve CSV gibi dosyalarda SQL doğrudan çalıştırabilirsiniz .

//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() 
+0

sürücüde gerekli verileri almak için de .take() yaparsınız. Bu hatayı görüyorum "Dosya bulunamadı. Altta yatan dosyaların güncellenmesi olasıdır. Önbelleği Spark'de açık olarak geçersiz kılabilirsiniz. SQL'de 'REFRESH TABLE tableName' komutunu çalıştırarak veya Dataset/DataFrame'i yeniden oluşturarak. Bunu nasıl çözebilirim? – Passionate

+0

Eğer spark.sqlContext() yaparsam yardımcı olmaz setConf ("spark.sql.parquet.cacheMetadata", "false"); – Passionate

+1

Çalışmaları! Sadece dosya yolu ile 'hdfs: // my_hdfs_path/my_db.db/my_table' değiştirin. :) – Cherry