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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.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数据集在数据帧上的缺点_Apache Spark - Fatal编程技术网

Apache spark Spark数据集在数据帧上的缺点

Apache spark Spark数据集在数据帧上的缺点,apache-spark,Apache Spark,我知道数据集(类型安全等)的优点,但我找不到任何与Spark数据集限制相关的文档 是否存在SparkDataset不推荐使用的任何特定场景,最好使用DataFrame 目前,我们所有的数据工程流程都使用Spark(Scala)DataFrame。 我们希望将数据集用于所有新流程。因此,了解Dataset的所有限制/缺点将对我们有所帮助 编辑:这与不同,这解释了对数据帧/数据集的一些操作。或者其他问题,其中大多数解释了rdd、dataframe和dataset之间的差异以及它们是如何演变的。这是为

我知道
数据集
(类型安全等)的优点,但我找不到任何与Spark数据集限制相关的文档

是否存在Spark
Dataset
不推荐使用的任何特定场景
,最好使用
DataFrame

目前,我们所有的数据工程流程都使用Spark(Scala)
DataFrame
。 我们希望将
数据集
用于所有新流程。因此,了解
Dataset
的所有限制/缺点将对我们有所帮助


编辑:这与不同,这解释了对数据帧/数据集的一些操作。或者其他问题,其中大多数解释了rdd、dataframe和dataset之间的差异以及它们是如何演变的。这是为了知道,什么时候不使用数据集

我发现在一些情况下,数据帧(或数据集[行])比类型化数据集更有用

例如,当我在使用没有固定模式的数据时,比如JSON文件,其中包含具有不同字段的不同类型的记录。使用数据帧,我可以轻松地“选择”出所需的字段,而无需了解整个模式,甚至可以使用运行时配置来指定要访问的字段

另一个需要考虑的问题是,Spark可以比UDAFs和自定义lambda更好地优化内置的Spark SQL操作和聚合。因此,如果您想获取列中某个值的平方根,这是Spark SQL中的内置函数(
df.withColumn(“rootX”,sqrt(“X”)
),但在lambda(
ds.map(X=>Math.sqrt(X))
)中进行此操作效率较低,因为Spark无法有效地优化lambda函数

还有许多非类型化的Dataframe函数(如统计函数)是为Dataframes而不是类型化的数据集实现的,并且您经常会发现,即使您从一个数据集开始,在完成聚合时,您仍然会得到一个Dataframe,因为这些函数通过创建新列来工作,修改数据集的架构


一般来说,我认为您不应该从工作数据帧代码迁移到类型化数据集,除非您有充分的理由这样做。从Spark 2.4.0开始,许多数据集功能仍被标记为“实验性”功能,如上所述,并非所有数据帧功能都具有数据集等效功能。

Spark数据集的限制:

  • 数据集(不确定是否已修复)
  • 无论何时更改Dataset模式,都需要定义一个新的case类,这很麻烦
  • 数据集提供的类型安全性不如您预期的那么多。我们可以向
    reverse
    函数传递一个日期对象,它将返回一个垃圾响应,而不是出错
  • 导入java.sql.Date
    病例类出生(hospitalName:String,生日:Date)
    val birthds=Seq(
    出生(“韦斯特切斯特”,日期。价值(“2014-01-15”))
    ).toDS()
    birthsDS.withColumn(“无意义”,背面为($“生日”)).show()
    

    这是一个奇怪的问题,因为这是前进的方向。为什么?应该有一些情况下,spark dataframes最适合,我们知道DataFrame是Dataset[Row],在任何情况下,我都没有做-1。我不喜欢吵架。最终,ds将占上风。如果我没记错的话,它可以使用mapPartitions。它还混合了rdd的内容。可能与按等分组的内容重复。名称也会丢失。
    +------------+----------+-----------+
    |hospitalName| birthDate|meaningless|
    +------------+----------+-----------+
    | westchester|2014-01-15| 51-10-4102|
    +------------+----------+-----------+