问题描述
我在胶水中有一个 pyspark 代码,我想在其中创建一个数据框,其地图结构是整数和字符串的组合。
样本数据:
{ "Candidates": [
{
"jobLevel": 6,"name": "Steven",},{
"jobLevel": 5,"name": "Abby",} ] }
因此,我尝试使用以下代码来创建地图数据类型。但是每次将整数数据类型 jobLevel 转换为字符串数据类型时。有什么建议可以通过保留作业级别的数据类型来完成这项工作吗?
使用的代码:
df = spark.sql("select Supervisor_name,map('job_level',INT(job_level_name),'name',employeeLogin) as Candidates
from dataset_1")
解决方法
我是 pyspark 的新手 :-)。但是,让我们尝试并行化,然后将模式定义为所需的;
js={ "Candidates": [
{
"jobLevel": 6,"name": "Steven",},{
"jobLevel": 5,"name": "Abby",} ] }
from pyspark.sql.types import *
df=sc.parallelize(js["Candidates"])
schema = StructType([StructField('name',StringType(),True),StructField('jobLevel',IntegerType(),True)])
df1=spark.read.json(df,schema)
df1.show(truncate=False)
df1.printSchema()
我明白了:
+------+--------+
|name |jobLevel|
+------+--------+
|Steven|6 |
|Abby |5 |
+------+--------+
root
|-- name: string (nullable = true)
|-- jobLevel: integer (nullable = true)
,
地图值不可能有不同的类型。在这种情况下使用结构体。
df = spark.sql("""
select Supervisor_name,struct(INT(job_level_name) as job_level,employeeLogin as name
) as Candidates
from dataset_1
""")