Вопрос:

Конкатенация строк в SQL-запросе Spark

sql scala apache-spark apache-spark-sql

7067 просмотра

2 ответа

150 Репутация автора

Я экспериментирую с Spark и Spark SQL, и мне нужно объединить значение в начале строкового поля, которое я получаю в качестве вывода из выбора (с объединением), как показано ниже:

val result = sim.as('s)   
    .join(
        event.as('e),
        Inner,
        Option("s.codeA".attr === "e.codeA".attr))   
    .select("1"+"s.codeA".attr, "e.name".attr)  

Допустим, мои таблицы содержат:

сим :

codeA,codeB
0001,abcd
0002,efgh

события :

codeA,name
0001,freddie
0002,mercury

И я хотел бы в качестве вывода:

10001,freddie
10002,mercury

В SQL или HiveQL я знаю, что у меня есть concatдоступная функция, но, похоже, Spark SQL не поддерживает эту функцию. Может кто-нибудь предложить мне обходной путь для моей проблемы?

Спасибо.

Примечание . Я использую встроенные языковые запросы, но в случае возможного решения я мог бы использовать только «стандартный» Spark SQL-запрос.

Автор: erond Источник Размещён: 13.10.2014 12:01

Ответы (2)


0 плюса

10704 Репутация автора

Вывод, который вы добавляете в конце, кажется, не является частью вашего выбора или вашей логики SQL, если я правильно понимаю. Почему бы вам не продолжить форматирование выходного потока в качестве дальнейшего шага?

val results = sqlContext.sql("SELECT s.codeA, e.code FROM foobar")
results.map(t => "1" + t(0), t(1)).collect()
Автор: huitseeker Размещён: 13.10.2014 12:42

0 плюса

4133 Репутация автора

Относительно легко внедрить новые Expressionтипы непосредственно в ваш проект. Вот что я использую:

case class Concat(children: Expression*) extends Expression {
  override type EvaluatedType = String

  override def foldable: Boolean = children.forall(_.foldable)
  def nullable: Boolean = children.exists(_.nullable)
  def dataType: DataType = StringType

  def eval(input: Row = null): EvaluatedType = {
    children.map(_.eval(input)).mkString
  }
}

val result = sim.as('s)
    .join(
        event.as('e),
        Inner,
        Option("s.codeA".attr === "e.codeA".attr))
    .select(Concat("1", "s.codeA".attr), "e.name".attr)
Автор: Nathan Howell Размещён: 21.10.2014 09:17
Вопросы из категории :
32x32