我可以使用以下代码来读取单个json文件,但我需要读取多个json文件并将它们合并到一个Dataframe中。我怎样才能做到这一点?
DataFrame jsondf = sqlContext.read().json("/home/spark/articles/article.json");
或者有没有办法将多个json文件读入JavaRDD然后转换为Dataframe?
答案 0 :(得分:9)
要在Spark中读取多个输入,请使用通配符。无论您是构建数据帧还是rdd,都是如此。
context.read().json("/home/spark/articles/*.json")
// or getting json out of s3
context.read().json("s3n://bucket/articles/201510*/*.json")
答案 1 :(得分:7)
您可以使用完全相同的代码来读取多个JSON文件。只需传递路径到目录/路径的通配符,而不是路径到单个文件。
DataFrameReader
还提供json
method with a following signature:
json(jsonRDD: JavaRDD[String])
可用于解析已加载到JavaRDD
的JSON。
答案 2 :(得分:0)
函数json(String... paths)
采用可变参数。 (documentation)
因此您可以这样更改代码:
sqlContext.read().json(file1, file2, ...)
答案 3 :(得分:0)
函数spark.read.json
接受文件列表作为参数。
spark.read.json(List_all_json file)
这将读取列表中的所有文件,并为文件中的所有信息返回一个数据框。
答案 4 :(得分:0)
使用pyspark,如果你把所有的json文件都放在同一个文件夹里,你可以使用df = spark.read.json('folder_path')
。此指令将加载文件夹内的所有 json 文件。
为了读取性能,我建议您提供数据帧架构:
import pyspark.sql.types as T
billing_schema = billing_schema = T.StructType([
T.StructField('accountId', T.LongType(),True),
T.StructField('accountName',T.StringType(),True),
T.StructField('accountOwnerEmail',T.StringType(),True),
T.StructField('additionalInfo',T.StringType(),True),
T.StructField('chargesBilledSeparately',T.BooleanType(),True),
T.StructField('consumedQuantity',T.DoubleType(),True),
T.StructField('consumedService',T.StringType(),True),
T.StructField('consumedServiceId',T.LongType(),True),
T.StructField('cost',T.DoubleType(),True),
T.StructField('costCenter',T.StringType(),True),
T.StructField('date',T.StringType(),True),
T.StructField('departmentId',T.LongType(),True),
T.StructField('departmentName',T.StringType(),True),
T.StructField('instanceId',T.StringType(),True),
T.StructField('location',T.StringType(),True),
T.StructField('meterCategory',T.StringType(),True),
T.StructField('meterId',T.StringType(),True),
T.StructField('meterName',T.StringType(),True),
T.StructField('meterRegion',T.StringType(),True),
T.StructField('meterSubCategory',T.StringType(),True),
T.StructField('offerId',T.StringType(),True),
T.StructField('partNumber',T.StringType(),True),
T.StructField('product',T.StringType(),True),
T.StructField('productId',T.LongType(),True),
T.StructField('resourceGroup',T.StringType(),True),
T.StructField('resourceGuid',T.StringType(),True),
T.StructField('resourceLocation',T.StringType(),True),
T.StructField('resourceLocationId',T.LongType(),True),
T.StructField('resourceRate',T.DoubleType(),True),
T.StructField('serviceAdministratorId',T.StringType(),True),
T.StructField('serviceInfo1',T.StringType(),True),
T.StructField('serviceInfo2',T.StringType(),True),
T.StructField('serviceName',T.StringType(),True),
T.StructField('serviceTier',T.StringType(),True),
T.StructField('storeServiceIdentifier',T.StringType(),True),
T.StructField('subscriptionGuid',T.StringType(),True),
T.StructField('subscriptionId',T.LongType(),True),
T.StructField('subscriptionName',T.StringType(),True),
T.StructField('tags',T.StringType(),True),
T.StructField('unitOfMeasure',T.StringType(),True)
])
billing_df = spark.read.json('/mnt/billingsources/raw-files/202106/', schema=billing_schema)