我有一个具有多个列的 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}]}]
df = spark.read.json("<Your JSON file path>")
df.write.option("header","true").csv("<Your CSV file path>")
首先,您可能需要检查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重塑它,这样所有的按键(,,等)都列,分别为: 使用作品: 但是 我需要一个解决方案, 因为我有很多 列名称,所以没有明确提及列名称 。 架构图 问题答案: 由于的键不是架构的一部分,因此您必须首先收集这些键,例如: 当您拥有了这些之后,剩下的就是简单的选择:
我有三个json字符串,如下所示
我有2个对象ExpertJpa到ExpertDto的现有映射,需要另一个参数来过滤ExpertJpa。这个映射工作正常,现在我尝试将ExpertJpa列表转换为ExpertDto列表,我添加了第二个参数。 在构建时,我收到错误消息,即List是一个接口,不能是实例…… 错误:(53,18) java:返回类型java.util.List是一个抽象类或接口。提供非抽象/非接口结果类型或工厂方法。
问题内容: 想法是在片中具有可变数量的通道,将通过通道接收的每个值推入单个通道,并在最后一个输入通道关闭后关闭该输出通道。这样的事情,但对于多个渠道来说,要超过两个: 上面的代码避免了繁忙的循环,因为没有任何情况,这是很好的(编辑:看起来,“,ok”的存在使select语句成为非阻塞状态,并且循环毕竟是繁忙的。但是出于示例的目的,就好像将代码阻止一样)。是否可以通过任意数量的输入通道来实现相同的功
问题内容: 我注意到Gson将字符串“ <”转换为JSON输出中的Unicode转义序列。您是否可以避免这种情况,还是必须始终在JSON中转义“ <”和“>”之类的字符? 考虑下面的示例:我只想 。 上下文:我正在创建的JSON片段与HTML页面甚至JavaScript无关;它只是用来将某些结构化信息传递给另一软件(嵌入在设备中,用C编写)。 问题答案: 您需要禁用HTML转义。