sparksql查询中的字符串连接

sparksql查询中的字符串连接,sql,scala,apache-spark,apache-spark-sql,Sql,Scala,Apache Spark,Apache Spark Sql,我正在试验Spark和Spark SQL,我需要在字符串字段的开头连接一个值,我从select(使用联接)检索该字段作为输出,如下所示: 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) 假设

我正在试验Spark和Spark SQL,我需要在字符串字段的开头连接一个值,我从select(使用联接)检索该字段作为输出,如下所示:

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)  
假设我的表包含:

sim卡

codeA,codeB
0001,abcd
0002,efgh
codeA,name
0001,freddie
0002,mercury
事件

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()

直接在项目中实现新的
表达式
类型相对容易。以下是我正在使用的:

case类Concat(子类:Expression*)扩展了Expression{
重写类型EvaluatedType=String
重写def foldable:Boolean=children.forall(uz.foldable)
def nullable:Boolean=children.exists(z.nullable)
def数据类型:数据类型=StringType
def eval(输入:行=空):EvaluatedType={
children.map(u.eval(input)).mkString
}
}
val结果=模拟结果('s)
.加入(
事件。如('e),
内部的
选项(“s.codeA.attr==”e.codeA.attr))
.选择(Concat(“1”、“s.codeA”.attr)、“e.name”.attr)

Hi@huitseek,谢谢你的回答。您的解决方案实际上可能是一个选项,因为我必须将输出格式化为选项卡分隔的值。但是,这个问题仍然有效,因为我还需要使用“连接值”执行另一个连接,例如:
选项(“s.codeA.attr===1+“r.codeA.attr)
其中r的codeA值为10001、10002,…我想您不需要做很多工作,比如使用map和创建函数。只需使用这个“val result=sim.as(“s”)。连接(事件,sim(“codeA”)===events(“codeA”),“inner”)。选择(“s.codeA”,“name”)。带列(“codeA”,concat(lit(“1”),lit(”),col(“codeA”)。显示“