簡體   English   中英

如何在Spark中投影實木復合地板文件?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM