如何将变量传入Spark DataFrame.selectExpr并正确执行stack行列转换
问题根因
你生成的finExp字符串存在两处拼接错误:
- 额外拼接了多余的外围双引号、无意义的
s字符,从报错的SQL片段可以看到,表达式整体被双引号包裹,Spark解析时会把引号识别为语法的一部分,触发语法错误。你手动复制输出内容时会自动忽略外围的引号,所以直接粘贴可以正常运行。 - 循环拼接
srchExp时字符串中间夹带了换行符,也会干扰SQL解析。
解决方法
简化字符串拼接逻辑,直接生成符合要求的SQL表达式即可,修正后的代码如下:
// 批量生成stack函数需要的参数,避免循环拼接的冗余逻辑 val srchExp = (1 to 15).map { i => s"'License Number $i',`Provider License Number_$i`,'Provider License Number State Code_$i',`Provider License Number State Code_$i`" }.mkString(",") // 拼接最终的SELECT表达式,无需额外加引号 val finExp = s"NPI, stack(15, $srchExp) as (License,LicNumber,Code,State)" // 直接传入参数即可运行 val retDF = npiDF.selectExpr(finExp) retDF
内容的提问来源于stack exchange,提问作者Hunter
相关产品推荐
相关产品推荐

