Apache spark Apache Spark 2.1-行对象的Scala冗长/繁重属性
我们在Scala 2.11中编写了一个spark应用程序,它运行在spark 2.1.0独立集群上。根据设计/要求,我们构建了行对象,该对象具有许多直接列(如100列),并且很少有嵌套列,其中一些嵌套列也很重,如具有20k到30k的序列。还有与Spark数据集相匹配的case类 例如:Apache spark Apache Spark 2.1-行对象的Scala冗长/繁重属性,apache-spark,apache-spark-sql,parquet,apache-spark-2.0,Apache Spark,Apache Spark Sql,Parquet,Apache Spark 2.0,我们在Scala 2.11中编写了一个spark应用程序,它运行在spark 2.1.0独立集群上。根据设计/要求,我们构建了行对象,该对象具有许多直接列(如100列),并且很少有嵌套列,其中一些嵌套列也很重,如具有20k到30k的序列。还有与Spark数据集相匹配的case类 例如: Row(column_01, column_02... .....column_150, column_151 = Seq, column_152 = Seq..
Row(column_01,
column_02...
.....column_150,
column_151 = Seq,
column_152 = Seq...column_160 = Seq)
其中一些Seq的尺寸为20k至30k
我很少关心行对象的这种冗长/繁重的属性如何影响性能?我们可以对代码进行哪些优化以提高性能?对集群调优有什么建议吗
我们已经在进行以下优化-
Spark对于重行没有特别的问题。我们可以管理数PB的数据,这些数据包含数百个字段,嵌套得很深 有几件事需要记住:
df.explain()
,查看Spark是否拉得太多,例如,当只需要结构的一个字段时,就需要整个结构。在撰写本文时,这方面存在一些问题。通常可以通过重写转换/查询来解决这些问题,以首先显式地选择所需的最小数据集您使用的是柱状拼花,因此可以使用dataframe语法仅选择需要处理和操作的列。如果使用“dataframe.as[class]”语法使用dataset,则会对整行进行反序列化,如果列太多,则开销会很大。您也可以使用dataset选择几个列,但需要将其转换为具有这些属性的类