为什么我的计数,明显和不同计数的数量在火花巨大的群集中非常慢

时间:2018-02-22 15:49:42

标签: apache-spark apache-spark-sql spark-dataframe

我有一个非常庞大的集群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

3 个答案:

答案 0 :(得分:1)

区别是Spark中的常见问题,如果可以,请使用countApproxDistinct。

答案 1 :(得分:1)

不同的计数会将所有数据移动到单个执行程序中。因此,尝试将Executor内存增加到最大值。它可以减少时间。

尝试缓存数据。所以我们可以消除磁盘Io。

答案 2 :(得分:0)

尝试使用

val rdd = sc.textFile("s3://your_path").cache()

因为当你启动计算.count()时每次为每个.count()函数读取一次spark文件,但是当你开始使用.cache()时它只会读取一次文件