我们使用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进行排序有时不起作用?
答案 0 :(得分:0)
我同意@Alexandros Biratsis
代码df.select("SHOP_NAME","SHOP_COMPANY_ID","SHOP_ID").show()
将使用
SELECT "SHOP_NAME","SHOP_COMPANY_ID","SHOP_ID" FROM (select * from shop_dim order by COUNTRY desc) the_alias
您可以尝试在Kylin的网络上运行此sql,结果应排序。