我将Parquet files的数据集加载为
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
合并在一起。
答案 0 :(得分:3)
SchemaRDD上项目的粗略等价物是.select(),它接受一个Expression对象实例并返回带有过滤字段的新SchemaRDD。执行选择后,您可以按照建议使用unionAll。 e.g。
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._是加载用于从符号构建表达式实例的隐式函数所必需的。
答案 1 :(得分:1)
您知道这些文件是如何生成的吗?
如果您知道,那么您应该已经知道架构和相应的类别。
否则我不认为还有另一种方式。你需要逐个加载。一旦在schemaRDD中提取数据,但甚至可以caltl 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