Pyspark 具有数组类型列的堆栈函数中出现spark selectExpr错误

Pyspark 具有数组类型列的堆栈函数中出现spark selectExpr错误,pyspark,apache-spark-sql,Pyspark,Apache Spark Sql,我有以下代码: str_stack_query ="stack( 7, 'SERIAL_NO',SERIAL_NO , 'TICKET_NO',TICKET_NO , 'FIXED_ASSET',FIXED_ASSET , 'RETREAT',RETREAT , 'ARTICLE',ARTICLE , 'DESCRIPTION',DESCRIPTION , 'ctl_rid',ctl_rid ) as (COL_NAME, SOURCE_VALUE)"

我有以下代码:

    str_stack_query ="stack( 7,  'SERIAL_NO',SERIAL_NO  ,  'TICKET_NO',TICKET_NO  ,  'FIXED_ASSET',FIXED_ASSET  ,  'RETREAT',RETREAT  ,  'ARTICLE',ARTICLE  ,  'DESCRIPTION',DESCRIPTION  ,  'ctl_rid',ctl_rid ) as (COL_NAME, SOURCE_VALUE)"

    column_model_df = complete_tabular_df.selectExpr("id","asset_id","source_max_date",str_stack_query ).cache()
我有一个错误:

AnalysisException:u“无法解析”堆栈(7,'序列号',完整表格式文件。
序列号
,'票号',完整表格式文件。
票号
,'固定资产',完整表格式文件。
固定资产
,'撤退',完整表格式文件。
撤退
,'ARTICLE',完整表格式文件。
文章
,'DESCRIPTION',complete表格式文件。
描述
,'ct>由于数据类型不匹配,l_rid',complete_tabular_df.
ctl_rid
):参数2(字符串)!=参数14(数组);第1行位置0;\n'Project[id#28823,asset#id#28804,source#max#u date#28861;,stack(7,序列号,序列号4551,票号,票号28847,固定资产,固定资产28848,退却,退却28849,文章,文章28850,描述,描述28851,ctl rid,ctl rid 28852)作为数组缓冲(列名,源值)]\n+-SubqueryAlias
complete\r\r\n8月4日,col.288 42.文章作为文章文章文章文章作为文章文章文章文章文章文章文章文章文章作为文章文章文章文章文章文章文章文章文章文章文章文章文章文章文章文章文章文章文章文章文章文章文章文章文章文章文章文章文章文章文章文章文章文章文章文章文章文章文章文章文章文章文章文章文章第50篇,第50,288 42.描述描述。描述描述描述描述描述。描述描述描述描述。描述描述描述描述描述描述描述描述描述,描述描述描述,描述描述描述,描述描述,描述描述,描述,描述,描述描述,描述,描述,描述,描述,描述,描述,描述,描述,描述,描述,描述,描述,描述,描述,描述,描述,描述,描述,描述,描述,描述,描述,描述,描述,描述,描述,描述,描述,描述,描述,描述,描述,描述,描述,描述,描述,描述,描述,描述,描述,描述,描述,描述,描述,描述,描述,描述,描述,描述,描述,描述,描述,描述,描述,描述,描述#28842.ctl#u rfp作为ctl#u rfp#28853,col#28842.ctl#ts作为ctl#u ts#28854,2855,col,28842.ctl,28842.ctl,28842.ctl,28842.ctl,28842.ctl,28842.ctl,288442.ctl,288442.ctl,288442.ctl,28842.ctl,28842.ctl,288442.ctl,作为ctl的文件名,288555,Col55,col,288442.ctl.ctl文件的日期作为ctl文件的日期作为ctl文件的日期作为ctl文件的日期,日期作为文件的日期是日期,日期是日期,288日,288日,58、288、288、288、288、288、288、288、288、288、288、288、288、42、42、42、42、42、42、42、42、42、42、42、42、42、42、42.CT8、42.ctl、42.ctl文件的日期作为60L,col#28842.source#max_date作为source#max_date#28861L]\n:+-Project[序列号4551,id 28823,资产id 28804,col 28842]\n:+-生成分解(数组)2860,退(2861),文章2862,描述2863,描述2863,描述2863,ctl(2863),ctl(U)摆脱(283559)号,票号号号号号号号号2859,固定资产2859,固定资产283559,固定资产2860,固定资产2860,退(2860),退(2860),退(2836),退(2861),退(2861,文章,文章2862,文章,文章2862,文章,描述2862,描述2863,描述2863,描述2863,描述2863,ctl(2863,ctl(2863,ctl(2863),ctl(ctl(ctl)摆脱摆脱(283,ctl)283,ctl摆脱(283,ctl(283)2836,ctl)283,ctl摆脱摆脱(283)2864,ctl(2836,ctl(283)2864,ctl,ctl摆脱(283)2836,ctl(283)_max_date(28373),true[col#28842]\n:

错误是因为此列:ctl_rid为数组类型,其他所有列均为字符串类型。
那么,有没有其他方法或者如何解决它呢?

使用
数组
函数从数组创建一个字符串,然后在
堆栈
函数中使用

示例:

df.show()
#+---+---+-----------+
#|sno| pp|    ctl_rid|
#+---+---+-----------+
#|  a|  b|[12, 34, 4]|
#+---+---+-----------+

str_stack_query ="stack(2,'sno',sno,'ctl_rid',array_join(ctl_rid,',')) as (COL_NAME,SOURCE_VALUE)"

df.selectExpr(str_stack_query).show()
#+--------+------------+
#|COL_NAME|SOURCE_VALUE|
#+--------+------------+
#|     sno|           a|
#| ctl_rid|     12,34,4|
#+--------+------------+

#incase if you want to show array in []
str_stack_query ="stack(2,'sno',sno,'ctl_rid',concat('[',array_join(ctl_rid,','),']')) as (COL_NAME,SOURCE_VALUE)"

df.selectExpr(str_stack_query).show()
#+--------+------------+
#|COL_NAME|SOURCE_VALUE|
#+--------+------------+
#|     sno|           a|
#| ctl_rid|   [12,34,4]|
#+--------+------------+