Apache spark Spark:如何使Spark执行一次转换,这取决于三个动作
我们已经编写了spark批处理应用程序(spark版本:2.3.0)。代码如下 转换:Apache spark Spark:如何使Spark执行一次转换,这取决于三个动作,apache-spark,hive,apache-spark-sql,spark-streaming,pyspark-sql,Apache Spark,Hive,Apache Spark Sql,Spark Streaming,Pyspark Sql,我们已经编写了spark批处理应用程序(spark版本:2.3.0)。代码如下 转换:数据集集合datads=flatMap(解析一些文件并返回数据集的函数);此数据集将有三种数据类型,按列记录类型区分:1、2、3 加载到临时表:collectionDataDS.createOrReplaceTempView(临时表)创建数据集的临时视图 Action1:sparkSession.sql(“插入到表1中,从recordtype='1'所在的临时表中选择COL1、COL2、COL3”)配置单元查询
数据集集合datads=flatMap
(解析一些文件并返回数据集的函数);此数据集将有三种数据类型,按列记录类型区分:1、2、3
加载到临时表:collectionDataDS.createOrReplaceTempView(临时表)代码>创建数据集的临时视图
Action1:sparkSession.sql(“插入到表1中,从recordtype='1'所在的临时表中选择COL1、COL2、COL3”)代码>配置单元查询以从临时表加载TABLE1表
Action2:sparkSession.sql(“插入到表2中,从recordtype='2'所在的临时表中选择COL4、COL5、COL6”)代码>配置单元查询以从临时表加载表2
Action3:sparkSession.sql(“插入到表2中,从recordtype='3'所在的临时表中选择COL7、COL8、COL9”)代码>配置单元查询以加载错误表
发生了什么:因为我们正在运行3个查询,这些查询只不过是单独的操作,所以flatmap转换被调用了三次(一次操作一次)。但我们的要求是我们应该只调用一次flatmap操作
CollectionFlattedData pojo代码如下
public class CollectionFlattenedData implements Serializable {
private String recordtype;
private String COL1;
private String COL2;
private String COL3;
private String COL4;
private String COL5;
private String COL6;
private String COL7;
private String COL8;
private String COL9;
//getters and setters of all the columns
}
不管怎样,我们都可以这样做。非常感谢您的早期响应。我们可以通过两种方式处理此问题,但首先确定“临时表”的大小
如果大小与RAM的顺序一致,即如果它能够缓存大量的临时表,那么您可以缓存它并在进一步的计算中使用它。(您可以从UI获取数据量)
另一种更好的方法是将数据保存到永久表中。
您可以像往常一样参考接下来的步骤
当您使用.createOrReplaceTempView()
时,您给出了一个名称,以便在类似spark sql的查询中进一步使用它。它不会在生成的数据帧上创建任何操作。如果您缓存数据集集合数据,那么接下来的两个操作将不会再次执行转换。@RamdevSharma:感谢您的回复,它为我们工作了。我使用了持久化而不是缓存