我的spark版本是1.5.0,我在spark-shell中使用spark-SQL做一些ETL,这是我的代码:
import com.databricks.spark.avro._
import org.apache.spark.sql.hive.HiveContext
val sqlContext = new HiveContext(sc)
import sqlContext.implicits._
import java.security.MessageDigest
val dfGoods = sqlContext.read.avro("hdfs:///user/data/date=*")
dfGoods.registerTempTable("goodsinfo")
val dfGoodsLmt=sqlContext.sql("SELECT * FROM (SELECT goodsid, etype, goodsattribute, row_number() over (partition by goodsid order by runid DESC) rank_num FROM goodsinfo) tmp WHERE rank_num =1")
我使用dfGoodsLmt.count()
查看行号,第一次结果总是错误的,但在那之后,我重新运行代码dfGoodsLmt.count()
,结果是对的。我已经多次尝试过,我不知道为什么。
这是一个演示代码,结果应该是1000,但我需要尝试不止一次才能得到正确的答案。
case class data(id:Int,name:Int)
val tmp=(1 to 1000) zip (1 to 1000)
tmp.map(x=>data(x._1,x._2)).toDF.registerTempTable("test_table")
sqlContext.sql("select * from (select *,row_number() over(partition by id order by id DESC)rank from test_table)tmp where rank=1").count