当前位置: 首页 > 面试题库 >

Pyspark:将具有嵌套结构的数组转换为字符串

胡锋
2023-03-14
问题内容

我有pyspark数据框,其中包含名为 Filters 的列:“ array>”

我想将数据帧保存在csv文件中,为此,我需要将数组转换为字符串类型。

我尝试将其强制转换为:DF.Filters.tostring()DF.Filters.cast(StringType()),但是这两种解决方案都会为“过滤器”列中的每一行生成错误消息:

org.apache.spark.sql.catalyst.expressions.UnsafeArrayData@56234c19

代码如下

from pyspark.sql.types import StringType

DF.printSchema()

|-- ClientNum: string (nullable = true)
|-- Filters: array (nullable = true)
    |-- element: struct (containsNull = true)
          |-- Op: string (nullable = true)
          |-- Type: string (nullable = true)
          |-- Val: string (nullable = true)

DF_cast = DF.select ('ClientNum',DF.Filters.cast(StringType()))

DF_cast.printSchema()

|-- ClientNum: string (nullable = true)
|-- Filters: string (nullable = true)

DF_cast.show()

| ClientNum | Filters 
|  32103    | org.apache.spark.sql.catalyst.expressions.UnsafeArrayData@d9e517ce
|  218056   | org.apache.spark.sql.catalyst.expressions.UnsafeArrayData@3c744494

样本JSON数据:

{"ClientNum":"abc123","Filters":[{"Op":"foo","Type":"bar","Val":"baz"}]}

谢谢 !!


问题答案:

我创建了一个样本JSON数据集来匹配该模式:

{"ClientNum":"abc123","Filters":[{"Op":"foo","Type":"bar","Val":"baz"}]}

select(s.col("ClientNum"),s.col("Filters").cast(StringType)).show(false)

+---------+------------------------------------------------------------------+
|ClientNum|Filters                                                           |
+---------+------------------------------------------------------------------+
|abc123   |org.apache.spark.sql.catalyst.expressions.UnsafeArrayData@60fca57e|
+---------+------------------------------------------------------------------+

使用explode()函数可以最佳化解决您的问题,该函数可以展平数组,然后使用星号扩展表示法:

s.selectExpr("explode(Filters) AS structCol").selectExpr("structCol.*").show()
+---+----+---+
| Op|Type|Val|
+---+----+---+
|foo| bar|baz|
+---+----+---+

使其成为由逗号分隔的单列字符串:

s.selectExpr("explode(Filters) AS structCol").select(F.expr("concat_ws(',', structCol.*)").alias("single_col")).show()
+-----------+
| single_col|
+-----------+
|foo,bar,baz|
+-----------+


 类似资料:
  • 几天来,我一直在考虑这个“简单”的练习,结果被困住了。我都快疯了。我需要将嵌套数组转换为HTML。下面是数组的示例: 而预期的结果应该是这样的: 我已经从一个helper函数开始(从数组创建每个标记),下面是它现在的样子: 到目前为止还不错。当我试图创建实际的HTML构建器函数时,这个棘手的部分就开始了。我想迭代数组的每个元素,检查它是否有一个嵌套的元素(子),保存指定的标记,再深入一些。 到目前

  • 我有一个与PHP链接的JavaScript AJAX。PHP有以下代码: 它的输出将是一个字符串: 我想用这些元素创建一个JavaScript数组: 是否有预定义的函数要使用?你有解决办法吗?

  • 我的一个数据帧(spark.sql)有这个模式。 我需要将其保存到CSV文件,但不使用任何扁平化,以以下格式分解。 我直接使用了命令 ,这符合我的目的,但我需要一个更好的方法。我正在使用派斯帕克

  • 我有一堆json数据,格式如下 我下面的代码在spark中,我做了一些聚合,如下所示 上面的代码给了我一个类似于 我需要将producta1列中的上述数组值转换为json对象数组,类似于 我试过类似的方法 上面的代码片段并没有给出我想要的结果。如何在spark java中实现Json对象数组?

  • 问题内容: 我有字符串: 某种数据可能是字符串: 我如何将其全部转换为上述数组? ) 谢谢帮忙,PK 问题答案: 给定值 这里有一些我可以满足您需要的代码¹: ¹实际上,它的作用还不止于此:它可以简单地封装在一个函数中,并且可以在所有三个输入值上进行配置(您可以将一个具有现有值的数组传递给它,并在必要时对其进行扩展)。

  • 问题内容: 我需要将结果集转换为字符串数组。我正在从数据库中读取电子邮件地址,我需要能够像这样发送它们: 这是我的阅读电子邮件地址的代码: MyOutput是: 我需要这样: 我正在使用Oracle 11g。 问题答案: 获得所需的输出: 替换这些行 通过