当Spark通过jdbc连接到kylin时,sql order by不起作用

时间:2019-05-14 07:02:09

标签: apache-spark jdbc kylin

我们使用apache spark通过jdbc从apache kylin查询数据,我们编写了一个带有order by子句的sql,但有时不起作用。

简而言之,麒麟中有一个名为shop_dim的表,字段SHOP_ID不是降序的,我使用spark jdbc查询sql select * from shop_dim order by shop_id desc以获取数据帧,如果我选择所有列,order by不起作用,但是如果我仅选择几个字段,则它起作用。

顺便说一句,我有一个猜测:如果麒麟表是维,则会出现此问题,如果表是度规,就可以。

以下是详细信息:

当我在网络浏览器(http://someip:7070/kylin/query#query_content_results)的麒麟页面上运行查询select * from shop_dim时 结果是:

+---------------+---------------+-------+
|      SHOP_NAME|SHOP_COMPANY_ID|SHOP_ID|
+---------------+---------------+-------+
|            ...|            839|      1|
|           ....|            264|      2|
|           ....|            790|      3|
|           ....|            199|      4|
|           ....|            692|      5|
|           ....|            673|      6|
|           ....|            647|      7|
|           ....|            753|      8|
|           ....|            711|      9|
|           ....|           3090|    600|
|           ....|           3091|    601|
|           ....|           3088|    602|
|           ....|           3097|    603|
|           ....|           3100|    604|
|           ....|           3106|    605|
|           ....|           3102|    606|
|           ....|           3104|    607|
|           ....|           3110|    608|
|           ....|           3191|    609|
|           ....|           3171|    610|
...    
...    
|           ....|           2046|    500|
+---------------+---------------+-------+

如果我在Kylin网站上查询select * from shop_dim order by shop_id desc, 结果是:

+---------------+---------------+-------+
|      SHOP_NAME|SHOP_COMPANY_ID|SHOP_ID|
+---------------+---------------+-------+
|           ....|           3184|    617|
|           ....|           3185|    616|
|           ....|           3175|    615|
|           ....|           3190|    614|
|           ....|           3183|    613|
|           ....|           3174|    612|
|           ....|           3186|    611|
|           ....|           3171|    610|
|           ....|           3191|    609|
|           ....|           3110|    608|
|           ....|           3104|    607|
|           ....|           3102|    606|
|           ....|           3106|    605|
|           ....|           3100|    604|
|           ....|           3097|    603|
|           ....|           3088|    602|
|           ....|           3091|    601|
|           ....|           3090|    600|
|           ....|           3076|    599|
|           ....|           3089|    598|
+---------------+---------------+-------+

然后我尝试使用spark:

object test { 
   val conf =new SparkConf()
   conf.setMaster("local")
   val spark=SparkSession.builder().config(conf).getOrCreate() 
   def main(args: Array[String]): Unit = { 
      val url="jdbc:kylin://someip:7070/fuyun"
      val tab_name = s"(select * from shop_dim order by shop_id desc) the_alias"   
      val df = spark.read.format("jdbc").option("url",url).option("user", "admin")
      .option("password", "KYLIN").option("driver", "org.apache.kylin.jdbc.Driver")
      .option("dbtable", tab_name).load()

      df.select("SHOP_ID").show()
      df.select("SHOP_NAME","SHOP_ID").show()
      df.select("SHOP_NAME","SHOP_COMPANY_ID","SHOP_ID").show()
      df.select("SHOP_NAME","SHOP_COMPANY_ID","SHOP_ID").orderBy(desc("SHOP_ID")).show()
  }
}

底部有4个show,前两个按预期工作,第三个没有,第四个按正确的顺序。

df.select("SHOP_ID").show()

的结果
+-------+
|SHOP_ID|
+-------+
|    617|
|    616|
|    615|
|    614|
|    613|
|    612|
|    611|
|    610|
|    609|
|    608|
|    607|
|    606|
|    605|
|    604|
|    603|
|    602|
|    601|
|    600|
|    599|
|    598|
+-------+

顺序正确。

df.select("SHOP_NAME","SHOP_ID").show()

的结果
+---------------+-------+
|      SHOP_NAME|SHOP_ID|
+---------------+-------+
|           ....|    617|
|           ....|    616|
|           ....|    615|
|           ....|    614|
|           ....|    613|
|           ....|    612|
|           ....|    611|
|           ....|    610|
|           ....|    609|
|           ....|    608|
|           ....|    607|
|           ....|    606|
|           ....|    605|
|           ....|    604|
|           ....|    603|
|           ....|    602|
|           ....|    601|
|           ....|    600|
|           ....|    599|
|           ....|    598|
+---------------+-------+

也可以。

但是df.select("SHOP_NAME","SHOP_COMPANY_ID","SHOP_ID").show()

的结果
+---------------+---------------+-------+
|      SHOP_NAME|SHOP_COMPANY_ID|SHOP_ID|
+---------------+---------------+-------+
|           ....|            839|      1|
|           ....|            264|      2|
|           ....|            790|      3|
|           ....|            199|      4|
|           ....|            692|      5|
|           ....|            673|      6|
|           ....|            647|      7|
|           ....|            753|      8|
|           ....|            711|      9|
|           ....|           3090|    600|
|           ....|           3091|    601|
|           ....|           3088|    602|
|           ....|           3097|    603|
|           ....|           3100|    604|
|           ....|           3106|    605|
|           ....|           3102|    606|
|           ....|           3104|    607|
|           ....|           3110|    608|
|           ....|           3191|    609|
|           ....|           3171|    610|
+---------------+---------------+-------+

顺序现在不降序,似乎与麒麟中的原始顺序相同。

所以我必须添加另一个.orderBy(desc("SHOP_ID"))才能使其正常工作:

df.select("SHOP_NAME","SHOP_COMPANY_ID","SHOP_ID").orderBy(desc("SHOP_ID")).show()

结果是:

+---------------+---------------+-------+
|      SHOP_NAME|SHOP_COMPANY_ID|SHOP_ID|
+---------------+---------------+-------+
|           ....|           3184|    617|
|           ....|           3185|    616|
|           ....|           3175|    615|
|           ....|           3190|    614|
|           ....|           3183|    613|
|           ....|           3174|    612|
|           ....|           3186|    611|
|           ....|           3171|    610|
|           ....|           3191|    609|
|           ....|           3110|    608|
|           ....|           3104|    607|
|           ....|           3102|    606|
|           ....|           3106|    605|
|           ....|           3100|    604|
|           ....|           3097|    603|
|           ....|           3088|    602|
|           ....|           3091|    601|
|           ....|           3090|    600|
|           ....|           3076|    599|
|           ....|           3089|    598|
+---------------+---------------+-------+

这是我的期望,但是我正在编写一个将由其他人调用的通用函数,我希望其他人仅将sql作为参数,而无需编写其他代码.orderBy(desc("XXX"))

那么为什么在kylin sql中使用spark进行排序有时不起作用?

1 个答案:

答案 0 :(得分:0)

我同意@Alexandros Biratsis

代码df.select("SHOP_NAME","SHOP_COMPANY_ID","SHOP_ID").show()将使用

这样的sql查询kylin
SELECT "SHOP_NAME","SHOP_COMPANY_ID","SHOP_ID" FROM (select * from shop_dim order by COUNTRY desc) the_alias

您可以尝试在Kylin的网络上运行此sql,结果应排序。