Неправильное использование '*' в выражении 'alias' в блокноте Zeppelin - PullRequest
0 голосов
/ 31 мая 2018

Я новичок в Zeppelin (и spark & ​​sql) и пытаюсь запустить пример в блокноте Zeppelin.Я не могу понять, что не так с этой ошибкой:

list: (table: String, col: String)Array[(String, String)]
tables: ()Array[(String, String)]
columns: (table: String)Array[(String, String)]
org.apache.spark.sql.AnalysisException: Invalid usage of '*' in expression 'alias';
  at org.apache.spark.sql.catalyst.analysis.CheckAnalysis$class.failAnalysis(CheckAnalysis.scala:39)
...

Пример, который я пытаюсь запустить, взят из этого поста: https://randerzander.github.io/?post=dynamic-forms.md

И код выглядит так:

def list(table: String, col: String) : Array[(String, String)] = {
  sqlContext.sql("select distinct " + col + " from " + table + " order by " + col).collect.map(x => (x(0).asInstanceOf[String], x(0).asInstanceOf[String]))
}

def tables(): Array[(String, String)] = {
 sqlContext.sql("show tables").collect.map(x => (x(0).asInstanceOf[String], x(0).asInstanceOf[String]))
}

def columns(table: String) : Array[(String, String)] = {
  sqlContext.sql("select * from " + table + " limit 0").columns.map(x => (x, x))
}

val col1 = z.select("col1", columns(table))
val col2 = z.select("col2", columns(table))
val query = "select " + col1 + "," + col2 + ", count(*) as count from " + table + " group by " + col1 + "," + col2 + " order by count desc"
val df = sqlContext.sql(query)
println("%table " + df.columns.mkString("\t"))
println(df.map(x => x.mkString("\t")).collect().mkString("\n"))

Спасибо

1 Ответ

0 голосов
/ 01 июня 2018

В коде есть несколько проблем.

  • на данный момент.таблица будет нулевой.
  • Если таблицы нет, то она всегда будет нулевой

Следующий код работает для меня.

def list(table: String, col: String) : Array[(String, String)] = {
  sqlContext.sql("select distinct " + col + " from " + table + " order by " + col).collect.map(x => (x(0).asInstanceOf[String], x(0).asInstanceOf[String]))
}

def tables(): Array[(String, String)] = {
 sqlContext.sql("show tables").collect.map(x => (x(1).asInstanceOf[String], x(1).asInstanceOf[String]))
}

def columns(table: String) : Array[(String, String)] = {
  sqlContext.sql("select * from " + table + " limit 0").columns.map(x => (x, x))
}

val table = z.select("table", tables()).asInstanceOf[String]
println(s"table:$table" )
val col1 = z.select("col1", columns(table))
val col2 = z.select("col2", columns(table))
val query = "select " + col1 + "," + col2 + ", count(1) as count from " + table + " group by " + col1 + "," + col2 + " order by count desc"
val df = sqlContext.sql(query)
println("%table " + df.columns.mkString("\t"))
println(df.map(x => x.mkString("\t")).collect().mkString("\n"))

enter image description here

...