Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在读取json时预定义dataframe的数据类型_Python_Json_Apache Spark_Pyspark_Apache Spark Sql - Fatal编程技术网

Python 在读取json时预定义dataframe的数据类型

Python 在读取json时预定义dataframe的数据类型,python,json,apache-spark,pyspark,apache-spark-sql,Python,Json,Apache Spark,Pyspark,Apache Spark Sql,我有一个包含100列的json文件,我想读取所有列以及两列的预定义数据类型 我知道我可以使用schema选项来实现这一点: struct1 = StructType([StructField("npi", StringType(), True), StructField("NCPDP", StringType(), True) spark.read.json(path=abc.json, schema=struct1) 但是,此代码只读取两列: >>> df.printSc

我有一个包含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列的数据类型。如何解决这个问题?

根据,模式可以是
StructType
String

我可以为您提供两种解决方案:

1-使用虚拟文件的架构 如果您有一个具有相同模式(即一行相同结构)的light文件,则可以将其作为Dataframe读取,然后将该模式用于其他json文件:

df=spark.read.json(“/path/to/dummy/file.json”)
schm=df.schema
df=spark.read.json(path=“abc.json”,schema=schm)
2-生成模式 这一步需要您提供列名(也可能提供类型)。 让我们假设
col
是一个dict,其(键、值)为(列名、列类型)

col\u list=['{col\u name}{col\u type}'。格式(
col_name=col_name,
col_类型=col_类型,
)对于col_name,col_键入col.items()]
模式_字符串=','。连接(列列表)
df=spark.read.json(path=“abc.json”,schema=schema\u string)

您可以先读取所有数据,然后转换有问题的两列:

df = spark.read.json(path=abc.json)
df.withColumn("npi", df["npi"].cast("string"))\
  .withColumn("NCPDP", df["NCPDP"].cast("string"))

很抱歉,我没有提到我有一些列前面有零,所以我不能在阅读df后进行打字。