我知道可以使用将RDD转换为数据集rdd.toDS
。但是也存在rdd.toDF
。彼此之间真的有任何好处吗?
在使用Dataset API一天后,我发现几乎所有的操作都将我带到DataFrame(例如withColumn
)。用转换RDD后toDS
,我经常发现需要再次转换为DataSet,因为再次将我带到了DataFrame。
我使用API错误吗?我应该坚持使用.toDF并仅在一系列操作的最后转换为DataSet吗?还是更早使用toDS有好处?
这是一个小的具体例子
spark
.read
.schema (...)
.json (...)
.rdd
.zipWithUniqueId
.map[(Integer,String,Double)] { case (row,id) => ... }
.toDS // now with a Dataset API (should use toDF here?)
.withColumnRenamed ("_1", "id" ) // now back to a DataFrame, not type safe :(
.withColumnRenamed ("_2", "text")
.withColumnRenamed ("_2", "overall")
.as[ParsedReview] // back to a Dataset
Run Code Online (Sandbox Code Playgroud) 我正在尝试为 scala 中的函子编写通用定律,格式可以在 scalacheck 测试中重用于许多函子。定律应该由构造函数 F[_] 和元素类型参数化,比如 A。
理想情况下,我会写这样的东西:
def functorLaw[A, F[_] :Arbitrary] (fn :Functor[F]) :Prop = forAll { (fa :F[A]) => true }
Run Code Online (Sandbox Code Playgroud)
(我使用 true 而不是法体,因为确切的计算对我的问题无关紧要)
然而,我能破解的最好方法是将它包装在一个抽象类中,为生成任意 F[A] 值提供一个隐含的抽象:
abstract class FunctorSpec[A :Arbitrary, F[_]] extends Properties("foo") {
implicit def arbitraryFA :Arbitrary[F[A]]
def functorLaw (fn :Functor[F]) :Prop = forAll { (fa :F[A]) => true }
}
Run Code Online (Sandbox Code Playgroud)
现在这可行,但并不理想。我需要为每个测试实例化我想要运行的类,并且需要在那里提供任意 FA 函数。当然,编译器需要这个函数,但是对于很多类型,它们存在应该执行它的隐式(例如对于 List[Int])。但是编译器将无法猜测这些隐式提供了任意FA,因此我需要自己实现这一点,这是非常重复的。例如:
object IntListFunctorSpec extends FunctorSpec[Int, List] {
def arbitraryFA :Arbitrary[List[Int]] = Arbitrary(arbitrary[List[Int]])
...
}
Run Code Online (Sandbox Code Playgroud)
我认为我不需要告诉 scalacheck 如何构建 int 列表。任何建议如何更优雅地做到这一点?
我尝试了其他关于更高级类型边界的问题,但我无法弄清楚如何使用它们,尽管它们听起来很接近。所以我想我会问。
Monocle的选项具有以下访问功能(for Optional[C,A]
):
getOption: C => Option[A]
set: A => C => C
Run Code Online (Sandbox Code Playgroud)
这与(部分)非对称数据镜头的原始定义不一致.我希望:
getOption: C => Option[A]
setOption: A => C => Option[C]
Run Code Online (Sandbox Code Playgroud)
这是什么原因?如何使用Monocle获得经典的局部镜片?在对镜头进行编程时,我发现确保整体设置比获取镜头要困难得多......