Ошибка sparkExEx в стековой функции со столбцами типов массивов - PullRequest
1 голос
/ 02 мая 2020

У меня есть этот код:

    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: вы не можете разрешить стек (7, 'SERIAL_NO', complete_tabular_df . SERIAL_NO, 'TICKET_NO', complete_tabular_df. TICKET_NO, 'FIXED_ASSET', complete_tabular_df. FIXED_ASSET, 'RETREAT', complete_tabular_df. RETREAT, 'ARTICLE', complete_tabular_df. ARTICLE, 'DESCRIPTION', complete_tabular_df . DESCRIPTION, 'ctl_rid', complete_tabular_df. ctl_rid) 'из-за несоответствия типов данных: Аргумент 2 (строка)! = Аргумент 14 (массив); строка 1, позиция 0; \ n'Project [id # 28823, asset_id # 28804, source_max_date # 28861L, стек (7, SERIAL_NO, SERIAL_NO # 4551, TICKET_NO, TICKET_NO # 28847, FIXED_ASSET, FIXED_ASSET # 28848, отступление, ОТСТУПЛЕНИЕ # 28849, статьи, в статье # 28850, описание, ОПИСАНИЕ # 28851, ctl_rid, ctl_rid # 28852) AS ArrayBuffer (COL_NAME, SOURCE_VALUE)] \ n + - SubqueryAlias ​​complete_tabular_df \ n + - Union \ n: - Проект [SERIAL_NO # 4551, id # 28823, asset_id # 28804, столбец # 28842.TICKET_NO AS TICKET_NO # 28 col # 28842.FIXED_ASSET AS FIXED_ASSET # 28848, col # 28842.RETREAT AS RETREAT # 28849, col # 28842. АРТИКУЛ, КАК СТАТЬЯ # 28850, col # 28842. ОПИСАНИЕ КАК ОПИСАНИЕ # 28851, col # 28842.ctl_rid AS ctl_rid # 28852, col # 28842.ctl_rfp AS ctl_rfp # 28842. col # 28853.ct # 28853. col # colt # 28853. col # colt # 28853. col # ctts # 28853. col # colt # 28853. col # ctts # 28853. col # ctts # 28853. col # ctts # 28853. col # ct # 28853. col # ct. AS ctl_ts # 28854, col # 28842.ctl_file_name AS as ctl_file_name # 28855, col # 28842.ctl_tid AS ctl_tid # 28856, col # 28842.ctl_sid AS ctl_sid # 28857, col # 28842.ctl_file_file_file_file_file_file_file_file_file_file_file_file_file AS ctl_eid # 28859, col # 28842.no_counts AS no_counts # 28860L, col # 28842.source_max_date AS source_max_date # 28861L] \ n: + - Проект [SERIAL_NO # 4551, id # 28823, asset_id # 28804, col # 28842] n : + - Создать разнесение (arrays_zip (TICKET_NO # 28359, FIXED_ASSET # 28360, RETREAT # 28361, СТАТЬЯ # 28362, ОПИСАНИЕ # 28363, ctl_rid # 28364, ctl_rfp # 28365, ctl_ts # 28366_t_tl_tl_tl_tl_t_ 28_l_t_tl_tl_tl_tl_tl_tl_tl_tl_tl_tl_tl_tl_tl_tl_t_l_t_lt 28286_t_tl_tl_tl, ct_name_tl 28369, ctl_file_date # 28370, ctl_eid # 28371, no_counts # 28372, source_max_date # 28373)), true, [col # 28842] \ n:

ошибка, так как этот столбец: ctl_rid имеет массив тип, а все остальные строковые е. Итак, есть ли другой способ сделать это или как это решить?

1 Ответ

1 голос
/ 02 мая 2020

Используйте функцию array_join для создания строки из массива , затем используйте функцию stack.

Example:

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]|
#+--------+------------+
...