繁体   English   中英

Spark SQL 查询中的字符串连接

[英]Strings concatenation in Spark SQL query

我正在尝试使用 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 查询,以防最终解决方案。

如果我理解正确,您最后添加的输出似乎不是您的选择或 SQL 逻辑的一部分。 为什么不进一步格式化输出流呢?

val results = sqlContext.sql("SELECT s.codeA, e.code FROM foobar")
results.map(t => "1" + t(0), t(1)).collect()

直接在项目中实现新的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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM