sql order by не работает, когда spark подключается к kylin через jdbc - PullRequest
2 голосов
/ 14 мая 2019

Мы используем 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иногда?

1 Ответ

0 голосов
/ 17 мая 2019

Я согласен с @Alexandros Biratsis

Код df.select("SHOP_NAME","SHOP_COMPANY_ID","SHOP_ID").show() будет запрашивать kylin с sql как

SELECT "SHOP_NAME","SHOP_COMPANY_ID","SHOP_ID" FROM (select * from shop_dim order by COUNTRY desc) the_alias

Вы можете попробовать запустить этот sql в сети Kylin, результат должен быть упорядочен.

...