如何在PySpark中更改嵌套列的datatype?对于rxample,如何将value的数据类型从string更改为int?
参考:如何在pyspark中将Dataframe列从String类型更改为Double类型
{
"x": "12",
"y": {
"p": {
"name": "abc",
"value": "10"
},
"q": {
"name": "pqr",
"value": "20"
}
}
}
可以使用以下方法读取json数据:
from pyspark import SQLContext
sqlContext = SQLContext(sc)
data_df = sqlContext.read.json("data.json", multiLine = True)
data_df.printSchema()
输出
root
|-- x: long (nullable = true)
|-- y: struct (nullable = true)
| |-- p: struct (nullable = true)
| | |-- name: string (nullable = true)
| | |-- value: long (nullable = true)
| |-- q: struct (nullable = true)
| | |-- name: string (nullable = true)
| | |-- value: long (nullable = true)
现在您可以访问y列中的数据,作为
data_df.select("y.p.name")
data_df.select("y.p.value")
abc, 10
from pyspark.sql.functions import *
from pyspark.sql import Row
df3 = spark.read.json("data.json", multiLine = True)
# create correct schema from old
c = df3.schema['y'].jsonValue()
c['name'] = 'z'
c['type']['fields'][0]['type']['fields'][1]['type'] = 'long'
c['type']['fields'][1]['type']['fields'][1]['type'] = 'long'
y_schema = StructType.fromJson(c['type'])
# define a udf to populate the new column. Row are immuatable so you
# have to build it from start.
def foo(row):
d = Row.asDict(row)
y = {}
y["p"] = {}
y["p"]["name"] = d["p"]["name"]
y["p"]["value"] = int(d["p"]["value"])
y["q"] = {}
y["q"]["name"] = d["q"]["name"]
y["q"]["value"] = int(d["p"]["value"])
return(y)
map_foo = udf(foo, y_schema)
# add the column
df3_new = df3.withColumn("z", map_foo("y"))
# delete the column
df4 = df3_new.drop("y")
df4.printSchema()
root
|-- x: long (nullable = true)
|-- z: struct (nullable = true)
| |-- p: struct (nullable = true)
| | |-- name: string (nullable = true)
| | |-- value: long (nullable = true)
| |-- q: struct (nullable = true)
| | |-- name: string (nullable = true)
| | |-- value: long (nullable = true)
df4.show()
+---+-------------------+
| x| z|
+---+-------------------+
| 12|[[abc,10],[pqr,10]]|
+---+-------------------+
我有两个火花数据帧。我想基于第二个更新第一个。 数据流1 df2 我想更新第一个数据帧(df1),如下所示 我不知道如何加入嵌套结构中的数据
问题内容: 我们需要将某些列的数据类型从int更改为bigint。不幸的是,其中一些表很大,大约有7-10百万行(但不宽)。 Alter表alter列将永远保留在这些表上。有没有更快的方法来实现这一目标? 问题答案: 巧合的是,大约3个小时前,我不得不做一些非常相似的事情。该表是3500万行,它相当宽,并且花了很多时间才能做到这一点: 这就是我最终得到的结果: 这次,这些陈述几乎是即时的。(在速度
问题内容: 我想将表示为列表列表的表转换为。作为一个极其简化的示例: 将列转换为适当类型的最佳方法是什么(在这种情况下,将列2和3转换为浮点数)?有没有一种方法可以在转换为DataFrame时指定类型?还是先创建DataFrame然后遍历各列以更改各列的类型更好?理想情况下,我想以动态方式执行此操作,因为可以有数百个列,并且我不想确切指定哪些列属于哪种类型。我可以保证的是,每一列都包含相同类型的值
问题内容: 我在80多个不同的表中都有一个ReferenceIDvarchar(6)列。我需要在分配ID的政府组织实施更改之后,将其扩展到整个db的varchar(8)。 我希望声明一个游标以获取表名,如下所示: 然后按如下所示编辑类型: 之所以失败,是因为该列是某些表中主键的一部分(并且PK中包含的列因表而异)。 我真的不想不必为每个表手动删除并重新创建每个PK。 在游标中,有一种方法可以在更改
问题内容: 我正在尝试更改derby db列的数据类型。当前价格列设置为DECIMAL(5,0)。我想将其更改为DECIMAL(7,2)。我是这样做的: 但是它不起作用,并显示错误: 我可以知道如何进行更改吗?谢谢你。 问题答案: 这是Derby SQL脚本,用于将列MY_TABLE.MY_COLUMN从BLOB(255)更改为BLOB(2147483647):
问题内容: 动物是一种动物。猫和狗都是。 现在,我正在尝试并希望使用“类型”来获取子类。 但是类型字段不在列之内。 提前致谢 :) 问题是类型不符合动物{}。 如果类型在动物{}中,则代码将起作用。但这不是t): 问题答案: 可能,但是键入JSON应该看起来像(完全限定名称) Abstract类 子类 现在,对于json 这将是实例 和 这将是例如 编辑 在这种情况下使用。例 动物类 对于 它运作