pyspark 如何从结构列中提取键值对

0h4hbjxa  于 2023-01-01  发布在  Spark
关注(0)|答案(1)|浏览(221)

在Spark中,我尝试提取结构列(也有结构)中的键-值对。
它看起来像这样:
| 列_1|
| - ------|
| {"键1 ":["值1 ","苹果"],"键2 ":{"键3 ":"香蕉","键4 ":{"密钥5 ":12345,"密钥6 ":23456,"键7":空,"键8":小行星54321|
此数据框的架构:

我需要的是访问嵌套字典key4,并从中获取所有的键-值对。我尝试使用以下代码来实现这一点:

def test_function(column_1):
  lst=[]
  test_dict=column_1['key2']['key4'].items()
  if test_dict is not None:
    for item in test_dict:
      lst.append(str(item))
  return(test_dict)
        
test_function_udf = udf(test_function)

dataframe.withColumn('get_output',test_function_udf('column_1')).select('column_1','get_output').display()

但它会导致以下错误:
Python异常:'属性错误:项的
如何获取键值对?
我还尝试了以下UDF:

def test_function(column_1):
  lst=[]
  test_dict=column_1['key2']['key4']
  for item in test_dict:
    lst.append(item)
  return(lst)
      
test_function_udf = udf(test_function)

aniProcessed.withColumn('test_xml',test_function_udf('column_1')).select('column_1','test_xml').display()

这至少帮助我获得字典的值,但我更迫切需要的是键(而不是值)

4nkexdtk

4nkexdtk1#

正如上面的用户Emma所建议的,这个问题的解决方案比我实际希望的要简单。为了解决这个问题,我简单地添加了asDict()。我最终使用的完整代码块是:

lst=[]
  test_dict=column_1['key2']['key4'].asDict().items()
  if test_dict is not None:
    for item in test_dict:
      lst.append(str(item))
  return(test_dict)

问题是,我想要迭代的对象被读取为Row对象,因此需要再次转换为字典。

相关问题