当前位置: 首页 > 知识库问答 >
问题:

pyspark中是否有一个函数可以将string(JSON)列转换为多列

戎俊
2023-03-14

我有一个具有多个列的 spark 数据帧,其中一个指标列数据类型为字符串格式。此列数据如下所示,我需要将其转换为多个列。我尝试使用火花rdd映射函数,它显示了一个类型值错误。

架构:列1,

列 2,

度量字符串

示例数据:

[{"name": "ABC","kt":

[{"name": "AB-1",

"values":

[{"date": "2021-05-21 08:04:56.000", "value":0.05520880298702948},

{"date": "2021-05-21 08:05:56.000", "value": 0.6873692705340528},

{"date": "2021-05-21 08:06:56.000", "value": 1.0036619131928861},

{"date": "2021-05-21 08:07:56.000", "value": 0.7431644238409444},

{"date": "2021-05-21 08:08:56.000", "value": 0.9845464929057735},

{"date": "2021-05-21 08:09:56.000", "value": 1.0010811066472702},

{"date": "2021-05-21 08:10:56.000", "value": 1.0009814513959714},

{"date": "2021-05-21 08:11:56.000", "value": 1.001614167307074},

{"date": "2021-05-21 08:12:56.000", "value": 1.001766291527917},

{"date": "2021-05-21 08:13:56.000", "value": 0.5865639742905218},

{"date": "2021-05-21 08:14:56.000", "value": 1.0015836161251768},

{"date": "2021-05-21 08:15:56.000", "value": 0.3571215446400451}]},

{"name": "BC-2",

"values":

[{"date": "2021-05-21 08:04:56.000", "value": 0.14044187962813096},

{"date": "2021-05-21 08:05:56.000", "value": 0.7565445799225486},

{"date": "2021-05-21 08:06:56.000", "value": 1.0017136900856412},

{"date": "2021-05-21 08:07:56.000", "value": 1.001730692743276},

{"date": "2021-05-21 08:08:56.000", "value": 1.0010340874676533},

{"date": "2021-05-21 08:09:56.000", "value": 1.0007168399510786},

{"date": "2021-05-21 08:10:56.000", "value": 1.0017091878186537},

{"date": "2021-05-21 08:11:56.000", "value": 1.0004370714489406},

{"date": "2021-05-21 08:12:56.000", "value": 1.0015819812456357},

{"date": "2021-05-21 08:13:56.000", "value": 0.7370171481823211},

{"date": "2021-05-21 08:14:56.000", "value": 1.001703540193026},

{"date": "2021-05-21 08:15:56.000", "value": 0.5519119341514123}]}]

共有2个答案

范振海
2023-03-14
df = spark.read.json("<Your JSON file path>")

df.write.option("header","true").csv("<Your CSV file path>")
益和雅
2023-03-14

首先,您可能需要检查JSON格式是否正确,因为给定的示例数据不是有效的JSON。

假设您的意图是将嵌套的JSON结构展平为行日期时间和值,您可以尝试类似的方法:

from pyspark.sql import SparkSession
import pyspark.sql.functions as f
import pyspark.sql.types as t

spark = SparkSession.builder.getOrCreate()

# example valid JSON 
json = """
[
    {
        "name": "ABC",
        "kt": [
            {
                "name": "AB-1",
                "values": [
                    {
                        "date": "2021-05-21 08:04:56.000",
                        "value": 0.05520880298702948
                    }
                ]
            },
            {
                "name": "BC-2",
                "values": [
                    {
                        "date": "2021-05-21 08:04:56.000",
                        "value": 0.14044187962813096
                    }
                ]
            }
        ]
    }
]
"""

json_df = spark.createDataFrame([(1, json)],['id', 'json'])

# define the schema for the dataframe
schema = t.ArrayType(
    t.StructType([
        t.StructField('name', t.StringType()),
        t.StructField('kt', t.ArrayType(
            t.StructType([
                t.StructField('name', t.StringType()),
                t.StructField('values', t.ArrayType(
                    t.StructType([
                        t.StructField('date', t.TimestampType()),
                        t.StructField('value', t.DoubleType())
                    ])
                ))
            ])
        ))
    ])
)

# select the string value in the 'json' column using the defined schema
df = json_df.select(
    f.from_json(f.col('json'), schema).alias('json')
)

# flatten the nested structure to expose date and properties as columns
df.select(
    f.explode('json')
).select(
    f.col('col.name').alias('name_0'),
    f.explode('col.kt')
).select(
    'name_0',
    'col.*'
).select(
    'name_0',
    f.col('name').alias('name_1'),
    f.explode('values')
).select(
    'name_0',
    'name_1',
    'col.*'
).show()

预期产出:

+------+------+-------------------+-------------------+
|name_0|name_1|               date|              value|
+------+------+-------------------+-------------------+
|   ABC|  AB-1|2021-05-21 08:04:56|0.05520880298702948|
|   ABC|  BC-2|2021-05-21 08:04:56|0.14044187962813096|
+------+------+-------------------+-------------------+
 类似资料:
  • 问题内容: 我需要将json对象转换为url形式,例如:“ parameter = 12&asd = 1” 我做到了: 但是我想知道是否在javascript或JSON对象中有任何功能可以做到这一点? 问题答案: jQuery提供的功能完全可以做到这一点。如果您不使用jquery,请看一下source。 基本上,它是这样的: 2019更新 :现在有一个内置对象用于这种事情:

  • 问题内容: 输入值 我有一列类型的表格: 输出量 我想在pyspark重塑它,这样所有的按键(,,等)都列,分别为: 使用作品: 但是 我需要一个解决方案, 因为我有很多 列名称,所以没有明确提及列名称 。 架构图 问题答案: 由于的键不是架构的一部分,因此您必须首先收集这些键,例如: 当您拥有了这些之后,剩下的就是简单的选择:

  • 我有2个对象ExpertJpa到ExpertDto的现有映射,需要另一个参数来过滤ExpertJpa。这个映射工作正常,现在我尝试将ExpertJpa列表转换为ExpertDto列表,我添加了第二个参数。 在构建时,我收到错误消息,即List是一个接口,不能是实例…… 错误:(53,18) java:返回类型java.util.List是一个抽象类或接口。提供非抽象/非接口结果类型或工厂方法。

  • 问题内容: 想法是在片中具有可变数量的通道,将通过通道接收的每个值推入单个通道,并在最后一个输入通道关闭后关闭该输出通道。这样的事情,但对于多个渠道来说,要超过两个: 上面的代码避免了繁忙的循环,因为没有任何情况,这是很好的(编辑:看起来,“,ok”的存在使select语句成为非阻塞状态,并且循环毕竟是繁忙的。但是出于示例的目的,就好像将代码阻止一样)。是否可以通过任意数量的输入通道来实现相同的功

  • 问题内容: 我注意到Gson将字符串“ <”转换为JSON输出中的Unicode转义序列。您是否可以避免这种情况,还是必须始终在JSON中转义“ <”和“>”之类的字符? 考虑下面的示例:我只想 。 上下文:我正在创建的JSON片段与HTML页面甚至JavaScript无关;它只是用来将某些结构化信息传递给另一软件(嵌入在设备中,用C编写)。 问题答案: 您需要禁用HTML转义。