[英]How do I project parquet file in spark?
我從Parquet文件加載數據集為
val sqc = new org.apache.spark.sql.SQLContext(sc)
val data = sqc.parquetFile("f1,f2,f3,f4,f5")
這里的文件"fN"
&c具有公共列"c1"
和"c2"
但其中一些可能還具有其他列。
因此,當我做
data.registerAsTable("MyTable")
我得到錯誤:
java.lang.RuntimeException: could not merge metadata: key pig.schema has conflicting values
問題是: 如何將那些實木復合地板文件放入只有兩列的單個表中?
即, 我如何投影它們 ?
似乎一個接一個地加載"fN"
,對其進行投影,然后使用unionAll
合並在一起似乎是合理的。
SchemaRDD上的項目的大致等效項是.select(),它接受一個Expression對象實例,並返回帶有過濾字段的新SchemaRDD。 選擇之后,您可以按照建議使用unionAll。 例如
val sqc = new org.apache.spark.sql.SQLContext(sc)
import sqc._
val file1 = sqc.parquetFile("file1").select('field1, 'field2)
val file2 = sqc.parquetFile("file2").select('field1, 'field2)
val all_files = file1.unionAll(file2)
需要導入sqc._來加載隱式函數,以便從符號構建表達式實例。
您知道這些文件是如何生成的嗎?
如果您知道,那么您應該已經知道該架構並相應地進行了分類。
否則,我認為沒有其他方法。 您需要一個一個地加載。 一旦您在schemaRDD中提取了數據,但即使它們屬於同一模式,也可以調用unionAll。
檢查來自github項目https://github.com/pankaj-infoshore/spark-twitter-analysis的示例代碼,其中處理了鑲木地板文件。
var path ="/home/infoshore/java/Trends/urls"
var files =new java.io.File(path).listFiles()
var parquetFiles = files.filter(file=>file.isDirectory).map(file=>file.getName)
var tweetsRDD= parquetFiles.map(pfile=>sqlContext.parquetFile(path+"/"+pfile))
var allTweets =tweetsRDD.reduce((s1,s2)=>s1.unionAll(s2))
allTweets.registerAsTable("tweets")
sqlContext.cacheTable("tweets")
import sqlContext._
val popularHashTags = sqlContext.sql("SELECT hashtags,usersMentioned,Url FROMtweets")
檢查我如何稱呼UnionAll。 您不能在表示不同架構的schemaRDD上調用unionAll。
讓我知道如果您需要特定幫助
問候Pankaj
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.