我有一个非常庞大的集群20 m4.Xlarge实例。 我的文件大小为20GB,文件中的记录数为193944092。
从这个文件我需要三个信息。
1.总记录数
2.不同记录的总数
3.基于一列(FundamentalSeriesId
)的不同记录总数。
当我在代码下面运行时需要很长时间。为了计算记录的总数,它花了7分钟。
但是对于FundamentalSeriesId列的不同记录的Total no和Total no,它花了很长时间我的意思是我已经取消了查询,因为它需要很长时间。
如果任何人可以改进我的代码那么好。我可以使用缓存或其他东西来更快地获取信息吗?
这就是我正在做的事情
val rdd = sc.textFile("s3://kishore-my-bucket-trf/Fundamental.FundamentalAnalytic.FundamentalAnalytic.SelfSourcedPublic.2011.1.2018-02-18-1340.Full.txt.gz")
println("Total count="+rdd.count())
val header = rdd.filter(_.contains("FundamentalSeriesId")).map(line => line.split("\\|\\^\\|")).first()
val schema = StructType(header.map(cols => StructField(cols.replace(".", "_"), StringType)).toSeq)
val data = sqlContext.createDataFrame(rdd.filter(!_.contains("FundamentalSeriesId")).map(line => Row.fromSeq(line.split("\\|\\^\\|").toSeq)), schema)
println("distinct count="+data.distinct.count())
val data1=data.select($"FundamentalSeriesId")
println("count of distinct FundamentalSeriesId column="+data1.distinct.count())
我的样本记录是这样的..
FundamentalSeriesId|^|FundamentalSeriesId.objectTypeId|^|FundamentalSeriesId.objectType_1|^|financialPeriodEndDate|^|financialPeriodType|^|lineItemId|^|analyticItemInstanceKey_1|^|AnalyticValue_1|^|AnalyticConceptCode_1|^|AnalyticValue.currencyId_1|^|AnalyticIsEstimated_1|^|AnalyticAuditabilityEquation_1|^|FinancialPeriodTypeId_1|^|AnalyticConceptId_1|^|sYearToDate|^|IsAnnual_1|^|TaxonomyId_1|^|InstrumentId_1|^|AuditID_1|^|PhysicalMeasureId_1|^|FFAction_1
答案 0 :(得分:1)
区别是Spark中的常见问题,如果可以,请使用countApproxDistinct。
答案 1 :(得分:1)
不同的计数会将所有数据移动到单个执行程序中。因此,尝试将Executor内存增加到最大值。它可以减少时间。
尝试缓存数据。所以我们可以消除磁盘Io。
答案 2 :(得分:0)
尝试使用
val rdd = sc.textFile("s3://your_path").cache()
因为当你启动计算.count()时每次为每个.count()函数读取一次spark文件,但是当你开始使用.cache()时它只会读取一次文件