Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.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
Scala Spark数据帧,方法问题除外_Scala_Apache Spark_Apache Spark Sql_Spark Dataframe - Fatal编程技术网

Scala Spark数据帧,方法问题除外

Scala Spark数据帧,方法问题除外,scala,apache-spark,apache-spark-sql,spark-dataframe,Scala,Apache Spark,Apache Spark Sql,Spark Dataframe,我有一个减两个数据帧的用例。所以我使用了dataframeexcept()方法 在较小的数据集上,这在本地运行良好 但是当我运行AWS S3 bucket时,except()方法并没有像预期的那样生成负数。在分布式环境中有什么需要注意的吗 有没有人面临过类似的问题 这是我的示例代码 val values = List(List("One", "2017-07-01T23:59:59.000", "2017-11-04T23:59:58.000", "A", "Yes") , List("T

我有一个减两个数据帧的用例。所以我使用了dataframeexcept()方法

在较小的数据集上,这在本地运行良好

但是当我运行AWS S3 bucket时,except()方法并没有像预期的那样生成负数。在分布式环境中有什么需要注意的吗

有没有人面临过类似的问题

这是我的示例代码

val values = List(List("One", "2017-07-01T23:59:59.000", "2017-11-04T23:59:58.000", "A", "Yes") 
  , List("Two", "2017-07-01T23:59:59.000", "2017-11-04T23:59:58.000", "X", "No") 
  , List("Three", "2017-07-09T23:59:59.000", "2017-12-05T23:59:58.000", "M", "Yes") 
  , List("Four", "2017-11-01T23:59:59.000", "2017-12-09T23:59:58.000", "A", "No") 
  , List("Five", "2017-07-09T23:59:59.000", "2017-12-05T23:59:58.000", "", "No") 
  ,List("One", "2017-07-01T23:59:59.000", "2017-11-04T23:59:58.000", "", "No")
)
  .map(row => (row(0), row(1), row(2), row(3), row(4)))

val spark = SparkSession.builder().master("local").getOrCreate()

import spark.implicits._

val df = values.toDF("KEY", "ROW_START_DATE", "ROW_END_DATE", "CODE", "Indicator")

val filterCond = (col("ROW_START_DATE") <= "2017-10-31T23:59:59.999" && col("ROW_END_DATE") >= "2017-10-31T23:59:59.999" && col("CODE").isin("M", "A", "R", "G"))


val Filtered = df.filter(filterCond)
val Excluded = df.except(df.filter(filterCond))
但在S3桶上运行时得到如下结果

Filtered.show(false)
+-----+-----------------------+-----------------------+----+---------+
|KEY  |ROW_START_DATE         |ROW_END_DATE           |CODE|Indicator|
+-----+-----------------------+-----------------------+----+---------+
|One  |2017-07-01T23:59:59.000|2017-11-04T23:59:58.000|A   |Yes      |
|Three|2017-07-09T23:59:59.000|2017-12-05T23:59:58.000|M   |Yes      |
+-----+-----------------------+-----------------------+----+---------+

Excluded.show(false)

+----+-----------------------+-----------------------+----+---------+
|KEY |ROW_START_DATE         |ROW_END_DATE           |CODE|Indicator|
+----+-----------------------+-----------------------+----+---------+
|One |2017-07-01T23:59:59.000|2017-11-04T23:59:58.000|A   |Yes      |---> wrong
|Four|2017-11-01T23:59:59.000|2017-12-09T23:59:58.000|A   |No       |
|Two |2017-07-01T23:59:59.000|2017-11-04T23:59:58.000|X   |No       |
|Five|2017-07-09T23:59:59.000|2017-12-05T23:59:58.000|    |No       |
|One |2017-07-01T23:59:59.000|2017-11-04T23:59:58.000|    |No       |
+----+-----------------------+-----------------------+----+---------+

有没有其他方法可以执行两个spark数据帧的减号?

S3不是一个完整的文件系统,而且

  • 尝试验证写入s3的数据是否与使用文件://dest时得到的数据相同。因为在路上有东西丢失的风险
  • 然后试着放一个线程,在s3和阅读之间睡眠(10000);这将显示是否出现目录不一致
  • 如果您正在使用EMR,请尝试使用他们的一致EMR选项
  • 然后尝试使用s3a://连接器

  • 如果它不能与issues.apache.org上的s3a://文件a SPARK-JIRA一起工作,那么也可以将s3a放入文本中,包括这个代码片段(它隐式地将其授权给ASF)。然后,我可以将它复制到一个测试中&看看我是否能看到它,如果可以,当我在Hadoop 3.1+中打开s3guard时,它是否消失了。根据两个数据帧上的唯一性,可以在两个数据帧上使用leftanti连接,这将为您提供从except操作中预期的输出

    val diffdf = df1.join(df2,Seq("uniquekey"),"leftanti")
    

    s3存储桶中的
    Filtered.show(false)
    是什么?Filtered.show(false)在两种环境中工作相同。更新了S3输出您尝试的是
    val Excluded=df.except(df.filter(filterCond))
    为什么不尝试使用
    val Excluded=df.except(filterCond)
    ?这有什么不同吗?我没有找到任何解决方案,因此我更改了编程功能。不确定为什么会出现这个问题,可能是因为spark的分布式处理特性。
    val diffdf = df1.join(df2,Seq("uniquekey"),"leftanti")