Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark Spark:如何使Spark执行一次转换,这取决于三个动作_Apache Spark_Hive_Apache Spark Sql_Spark Streaming_Pyspark Sql - Fatal编程技术网

Apache spark Spark:如何使Spark执行一次转换,这取决于三个动作

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”)配置单元查询

我们已经编写了spark批处理应用程序(spark版本:2.3.0)。代码如下

转换:
数据集集合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:感谢您的回复,它为我们工作了。我使用了持久化而不是缓存