我有一个包含100列的json文件,我想读取所有列以及两列的预定义数据类型。
我知道我可以使用schema选项来做到这一点:
struct1 = StructType([StructField("npi", StringType(), True), StructField("NCPDP", StringType(), True)
spark.read.json(path=abc.json, schema=struct1)
但是,此代码仅读取两列:
>>> df.printSchema()
root
|-- npi: string (nullable = true)
|-- NCPDP: string (nullable = true)
要使用上述代码,我必须提供所有100列的数据类型。我该怎么解决?
答案 0 :(得分:1)
根据official documentation,模式可以是StructType
或String
。
我可以为您提供2种解决方案:
如果您有一个具有相同架构的light文件(即一行具有相同的结构),则可以将其读取为Dataframe,然后将该架构用于其他json文件:
df = spark.read.json("/path/to/dummy/file.json")
schm = df.schema
df = spark.read.json(path="abc.json", schema=schm)
此步骤需要您提供列名(也许还提供类型)。
假设col
是一个(键,值)为(列名,列类型)的字典。
col_list = ['{col_name} {col_type}'.format(
col_name=col_name,
col_type=col_type,
) for col_name, col_type in col.items()]
schema_string = ', '.join(col_list)
df = spark.read.json(path="abc.json", schema=schema_string)
答案 1 :(得分:0)
您可以先读取所有数据,然后转换有问题的两列:
df = spark.read.json(path=abc.json)
df.withColumn("npi", df["npi"].cast("string"))\
.withColumn("NCPDP", df["NCPDP"].cast("string"))