2

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

4

2 回答 2

0

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

val results = sqlContext.sql("SELECT s.codeA, e.code FROM foobar")
results.map(t => "1" + t(0), t(1)).collect()
于 2014-10-13T12:42:41.063 回答
0

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)
于 2014-10-21T21:17:10.227 回答