在spark SQL 1.2.1中没有弃用警告,以下代码在1.3
中停止工作在1.2.1中工作(没有任何弃用警告)
val sqlContext = new HiveContext(sc)
import sqlContext._
val jsonRDD = sqlContext.jsonFile(jsonFilePath)
jsonRDD.registerTempTable("jsonTable")
val jsonResult = sql(s"select * from jsonTable")
val foo = jsonResult.zipWithUniqueId().map {
case (Row(...), uniqueId) => // do something useful
...
}
foo.registerTempTable("...")
停止在1.3.0中工作(根本不编译,我所做的只是改为1.3)
jsonResult.zipWithUniqueId() //since RDDApi doesn't implement that method
无法解决方法:
虽然这可能会给我一个RDD [Row]:
jsonResult.rdd.zipWithUniqueId()
现在这不会起作用RDD[Row]
当然没有registerTempTable
方法
foo.registerTempTable("...")
以下是我的问题
答案 0 :(得分:5)
这不是一个错误,但对于混乱感到抱歉!直到Spark 1.3,Spark SQL被标记为Alpha组件,因为API仍在不断变化。使用Spark 1.3,我们毕业并稳定了API。有关移植时需要执行的操作的完整说明,请参阅the documentation。
我也可以回答您的具体问题,并为我们进行这些更改的原因提供一些理由
停止在1.3.0中工作(根本不编译,我所做的只是改为1.3)
jsonResult.zipWithUniqueId() //since RDDApi doesn't implement that method
DataFrame现在是Scala和Java的统一界面。但是,由于我们必须与1.X的其余部分保持与现有RDD API的兼容性,DataFrames
不是RDD
。要获得RDD表示,您可以致电df.rdd
或df.javaRDD
此外,由于我们担心隐式转换可能会出现一些混淆,因此我们必须明确调用rdd.toDF
以使RDD转换发生。但是,如果您的RDD包含从Product
继承的对象(即元组或案例类),则此转换仅自动生效。
回到最初的问题,如果你想对任意模式的行进行转换,你需要在map操作之后明确地告诉Spark SQL数据的结构(因为编译器不能)。
import org.apache.spark.sql.types._
val jsonData = sqlContext.jsonRDD(sc.parallelize("""{"name": "Michael", "zip": 94709}""" :: Nil))
val newSchema =
StructType(
StructField("uniqueId", IntegerType) +: jsonData.schema.fields)
val augmentedRows = jsonData.rdd.zipWithUniqueId.map {
case (row, id) =>
Row.fromSeq(id +: row.toSeq)
}
val newDF = sqlContext.createDataFrame(augmentedRows, newSchema)