Мы используем apache spark для запроса данных из apache kylin через jdbc, мы пишем sql с предложением order by
, но иногда это не работает.
Вкратце, есть таблица с именем shop_dim
в kylin поле SHOP_ID
не в порядке убывания, я использую spark jdbc для запроса sql select * from shop_dim order by shop_id desc
для получения кадра данных. Если я выберу все столбцы, order by
не будет работать, но если я выберу только несколько полей, это работает.
Кстати, у меня есть предположение: если таблица kylin это измерение, эта проблема возникает, если таблица является мерой, это нормально.
Это деталиниже:
Когда я запускаю запрос select * from shop_dim
на странице kylin веб-браузера (http://someip:7070/kylin/query#query_content_results) Результат:
+---------------+---------------+-------+
| 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|
+---------------+---------------+-------+
Если я запрашиваю select * from shop_dim order by shop_id desc
на Kylinweb, результат:
+---------------+---------------+-------+
| 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|
+---------------+---------------+-------+
Порядок теперь не нисходящий, кажется, он совпадает с исходным порядком в kylin.
Поэтому я должен добавить еще .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иногда?