当前位置: 首页 > 面试题库 >

Spark Java Map函数被执行两次

唐运诚
2023-03-14
问题内容

我上面的代码作为Spark驱动程序,当我执行程序时,它可以正常工作,将所需数据保存为Parquet文件。

String indexFile = "index.txt";
JavaRDD<String> indexData = sc.textFile(indexFile).cache();
JavaRDD<String> jsonStringRDD = indexData.map(new Function<String, String>() {
  @Override
  public String call(String patientId) throws Exception {
   return "json array as string"
  }   
});

//1. Read json string array into a Dataframe (execution 1)
DataFrame dataSchemaDF = sqlContext.read().json(jsonStringRDD );
//2. Save dataframe as parquet file (execution 2)
dataSchemaDF.write().parquet("md.parquet");

但是我观察到我在RDD上的映射器函数indexData被执行两次。首先,当我读jsonStringRddDataFrame使用SQLContext
第二时,当我将其写入 dataSchemaDF实木复合地板文件时

您能指导我如何避免这种重复执行吗?还有其他更好的方法将JSON字符串转换为Dataframe吗?


问题答案:

我认为原因是JSON阅读器缺少架构。执行时:

sqlContext.read().json(jsonStringRDD);

Spark必须为新创建的推断架构DataFrame。为此,它具有扫描输入RDD,并且急切地执行此步骤

如果要避免这种情况,则必须创建一个StructType描述JSON文档形状的:

StructType schema;
...

并在创建时使用它DataFrame

DataFrame dataSchemaDF = sqlContext.read().schema(schema).json(jsonStringRDD);


 类似资料:
  • 问题内容: 我有一个从Qt Designer派生的简单窗口 (design.py) ,其中包含三个单选按钮: 并且我添加了此代码,以便监视选中了哪个单选按钮。 我注意到,如果选中radioButton1,它似乎可以正常工作,但是如果选中radiobutton2或radiobutton3,则将检查消息打印两次。 另一方面,如果我将每个信号都连接到不同的功能,例如: 然后它会按预期工作。 因此,我想将

  • 我在帐户a中有一个lambda函数,试图从帐户B访问资源。创建了一个新的lambda角色,该角色具有基本执行功能,可以将日志上载到cloud watch。 以下是我在Python 3.7中的函数代码: 还修改了账户B中假定角色的信托政策,如文件中所述:https://aws.amazon.com/premiumsupport/knowledge-center/lambda-function-ass

  • 我需要在我的服务器上运行函数 但是由于安全原因被禁用,但是PHP执行函数正在运行和。 是否可以使用php函数执行相同的操作? 禁用功能 链接,符号链接,执行,通过,proc_close,proc_get_status,proc_open,shell_exec,系统,流行,关闭

  • 问题内容: 如果我在端口8080上运行以下简单的http服务器代码,则一切正常。如果我在端口80上运行相同的代码,只需更改端口,处理程序功能就会对每个请求执行两次。为什么,以及如何解决? 如果在浏览器中输入localhost:8080,我将收到一个响应,其计数从1开始,并随每个新请求增加1。 如果将代码更改为端口80并在浏览器中仅输入localhost或localhost:80,则会收到第一个响应

  • #include <stdio.h> int global = 1; int func(void) { return (++global); } int main(void) { printf("%d\n", global); return 0; } 技巧 使用gdb调试程序时,可以使用“call”或“print”命令直接调用函数执行。以上面程序为例: (gdb)

  • 从HomeActivity我正在尝试从CreateProfileActivity获取结果。在这里我要做什么来开始这个活动 以下是HomeActivity中方法的实现: 当im完成并按下save in后,下面是我将数据发送回HomeActivity的操作: 在上调用setResult方法一次,但由于某种未知原因,当数据到达方法时,get execute两次。第一个结果的和第二个结果的。在此之后,得到