当前位置: 首页 > 知识库问答 >
问题:

Spark 2.0数据集与数据帧

强志学
2023-03-14
    null
    null
  • 为什么要使用UDF/UADF而不是map(假设map保留在数据集表示中)?

共有1个答案

顾斌
2023-03-14

>

  • df.select(“foo”)df.select($“foo”)之间的区别是签名。前者至少使用一个字符串,后者使用零个或多个。除此之外没有任何实际区别。
  • mydataset.map(foo.someval)类型检查,但由于任何dataset操作都使用对象的rdd操作,并且与dataframe操作相比,会产生很大的开销。我们来看一个简单的例子:

    case class FooBar(foo: Int, bar: String)
    val ds = Seq(FooBar(1, "x")).toDS
    ds.map(_.foo).explain
    
    == Physical Plan ==
    *SerializeFromObject [input[0, int, true] AS value#123]
    +- *MapElements <function1>, obj#122: int
       +- *DeserializeToObject newInstance(class $line67.$read$$iw$$iw$FooBar), obj#121: $line67.$read$$iw$$iw$FooBar
          +- LocalTableScan [foo#117, bar#118]
    

    如您所见,此执行计划要求访问所有字段,并且必须deserializeObject

    不是。通常,其他方法不是语法糖,并且生成一个显著不同的执行计划。例如:

    ds.select($"foo").explain
    
    == Physical Plan ==
    LocalTableScan [foo#117]
    

    如果没有map语句,我怎么可能df.select(“foo”)类型安全?

    没有这样的选择。虽然类型化列允许您将静态数据集转换为另一个静态类型化数据集:

    ds.select($"bar".as[Int])
    

    没有类型安全。还有一些其他尝试包括类型安全优化操作,比如类型化聚合,但是这个实验API。

    这完全取决于你。Spark中的每个分布式数据结构都有自己的优点和缺点(例如,请参见Spark UDAF将ArrayType作为bufferSchema的性能问题)。

    就我个人而言,我认为静态类型的dataset是最不有用的:

    >

  • 不提供与dataset[Row]相同的优化范围(尽管它们共享存储格式和某些执行计划优化,但它不能完全受益于代码生成或离堆存储),也不能访问dataframe的所有分析功能。

    ds.groupBy("foo").agg(sum($"bar") as "bar").as[FooBar].filter(x => true).where($"foo" === 1).explain
    
    == Physical Plan ==
    *Filter (foo#133 = 1)
    +- *Filter <function1>.apply
       +- *HashAggregate(keys=[foo#133], functions=[sum(cast(bar#134 as double))])
          +- Exchange hashpartitioning(foo#133, 200)
             +- *HashAggregate(keys=[foo#133], functions=[partial_sum(cast(bar#134 as double))])
                +- LocalTableScan [foo#133, bar#134]
    
    ds.groupBy("foo").agg(sum($"bar") as "bar").as[FooBar].where($"foo" === 1).explain
    
    == Physical Plan ==
    *HashAggregate(keys=[foo#133], functions=[sum(cast(bar#134 as double))])
    +- Exchange hashpartitioning(foo#133, 200)
       +- *HashAggregate(keys=[foo#133], functions=[partial_sum(cast(bar#134 as double))])
          +- *Filter (foo#133 = 1)
             +- LocalTableScan [foo#133, bar#134] 
    

    这会影响谓词下推或投影下推等功能。

    它不像RDDS那样灵活,只有一小部分本机支持的类型。

    相关问题:

      null

  •  类似资料:
    • 我正在尝试迁移到Spring Data R2DBC,我找不到对Amazon Redshift数据库的支持,如果有支持,有人可以帮助我吗? 下面是spring文档url,它支持的数据库很少,但红移不在列表中。https://spring.io/projects/spring-data-r2dbc

    • 数据库的查询结果也就是数据集,默认的配置下,数据集的类型是一个二维数组,我们可以配置成数据集类,就可以支持对数据集更多的对象化操作,需要使用数据集类功能,可以配置数据库的resultset_type参数如下: return [ // 数据库类型 'type' => 'mysql', // 数据库连接DSN配置 'dsn' => '',

    • 我是一名web开发人员,任务是创建某种机制,将数据从IBM AS400移动到SQL Server。不幸的是,链接服务器在这种情况下是不可能的,因为SQL Server只是标准版(该版本中没有db2提供程序),而AS400服务器在一个单独的服务器上。我研究过在AS400表上添加某种触发器,该触发器调用将数据插入SQL server的web服务,但这似乎不是最好的方法。当数据提交到AS400时,有人对

    • 我正在使用一个表在Jaspersoft Studio 5.6.1中创建简单的报告。 通过 JRBeanCollectionDataSource 从 Java 向此报告发送数据。 在报告中,我已经可以获取此数据 vie 字段:报告- 现在我可以显示输入的数据了。 但如果我想在表中执行,我需要创建数据集(为什么?)并选择“使用用于填充主报告的相同连接”。将相同的字段添加到新数据集没有帮助,也没有为数据

    • 数据与数据结构 1. 数据 1.1 数据(data) 数据:是信息的载体,是描述客观事物的数、字符,以及所有能输入到计算机中并被计算机程序识别和处理的符号的集合。 1.2 数据大致分的两类:(1)数值性数据;(2)非数值数据 数值性数据:主要包括整数、浮点数、复数、双精度数等,主要用于工程和科学计算,以及商业事务处理。 非数值数据:主要包括字符和字符串,以及文字、图形、图像、语音等数据。 1.3