如何在spark中投影镶木地板文件?

时间:2015-01-20 17:33:14

标签: scala apache-spark

我将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合并在一起。

2 个答案:

答案 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