我在S3Bucket上存储了大量(35k)的小(16kb)json文件。我需要将它们加载到DataFrame中以便进一步处理,这是我的提取代码:
val jsonData = sqlContext.read.json("s3n://bucket/dir1/dir2")
.where($"nod1.filter1"==="filterValue")
.where($"nod2.subNode1.subSubNode2.created"(0)==="filterValue2")
我将这些数据存储到临时表中并用于进一步的操作(将嵌套结构分解为单独的数据框)
jsonData.registerTempTable("jsonData")
所以现在我为这个深度嵌套的数据帧自动生成了模式。
使用上面的代码我有可怕的性能问题我认为它是由于在桶加载期间不使用sc.parallelize引起的,而且我很确定read.json()方法中的模式自动生成需要花费很多时间。 / p>
我的水桶如何装载,更高效,更快? 有没有办法提前声明这个模式(我需要解决Case Class元组问题)以避免自动生成? 在加载过程中过滤数据是否有意义,或者我应该简单地加载所有数据并过滤数据?
sqlContext.jsonRdd(rdd, schema)
它使用自动生成的模式完成了部分,但是InteliJ对折旧方法感到尖叫,有什么替代方法吗?
答案 0 :(得分:0)
作为case类的替代方法,使用实现Product接口的自定义类,然后DataFrame将使用类成员公开的模式,而不使用case类约束。在此处查看内嵌评论http://spark.apache.org/docs/latest/sql-programming-guide.html#inferring-the-schema-using-reflection
如果您的json由无根段的片段组成,您可以使用s3distcp对文件进行分组并将它们连接成较少的文件。同时尝试s3a协议,因为它比s3n具有更好的性能。