在Spark的文档中,它说RDDs方法reduce需要一个关联的AND可交换二进制函数.
但是,该方法reduceByKey仅需要关联二进制函数.
sc.textFile("file4kB", 4)
Run Code Online (Sandbox Code Playgroud)
我做了一些测试,显然这是我得到的行为.为何如此区别?为什么reduceByKey确保二进制函数总是以某种顺序应用(以适应缺乏可交换性)何时reduce不?
例如,如果加载一些(小)文本有4个分区(最小):
val r = sc.textFile("file4k", 4)
Run Code Online (Sandbox Code Playgroud)
然后:
r.reduce(_ + _)
Run Code Online (Sandbox Code Playgroud)
返回一个字符串,其中的部分并不总是以相同的顺序,而:
r.map(x => (1,x)).reduceByKey(_ + _).first
Run Code Online (Sandbox Code Playgroud)
始终返回相同的字符串(其中所有内容的顺序与原始文件中的顺序相同).
(我检查过r.glom,文件内容确实分布在4个分区,没有空分区).
在工作中,我们必须应对一个非常庞大的git存储库(90Go).尝试在我的本地副本上调整一些东西(我有一个包文件的错误,试图解压缩它),我可能已经删除了一些目标文件.例如:
> git gc
错误:无法读取af9ed8 [:snip:]
致命的:坏树对象af9ed8 [:snip:]
错误:无法运行重新包装
如何从远程存储库中获取特定对象(在这种情况下是具有散列af9ed8的那个...)?
Rust教程经常提倡使用
fn my_func(x: &Something)
Run Code Online (Sandbox Code Playgroud)
通过引用传递参数.这使得在调用站点上显然需要明确地获取值参考:
my_func(&my_value).
Run Code Online (Sandbox Code Playgroud)
但我查了一下,可以使用模式匹配中常用的'ref'关键字来做:
fn my_func(ref x: Something)
Run Code Online (Sandbox Code Playgroud)
然后,我可以简单地称之为
my_func(my_value)
Run Code Online (Sandbox Code Playgroud)
在内存方面,这是否像我期望的那样工作,还是在调用myFunc之前将myValue复制到堆栈上,然后获取对副本的引用?
在:
n = import <nixpkgs> {};
Run Code Online (Sandbox Code Playgroud)
n包含一个属性n.pkgs,它似乎也包含所有可用的包.有什么区别,然后之间n和n.pkgs?
它似乎与Nix配置的fixpoint语义和从nixpkgs覆盖一些包的可用性有关,但我无法真正地围绕它并找到明确的区别.
我有
data D t = ...
data SomeStuff = forall a (Typeable a, ...) => SomeStuff a
Run Code Online (Sandbox Code Playgroud)
在某些时候,我得到了一个 SomeStuff,a我想尝试将其内部转换为D t(任何类型t都可以,我只对这部分感兴趣)。一些(在伪 Haskell 中)看起来像:D
case someStuff of
SomeStuff (_ :: a) -> case eqT :: Maybe (a :~: (exists t. D t)) of
Just Refl -> -- proven that `exists t. a ~ D t`
Nothing -> -- nothing to do here
Run Code Online (Sandbox Code Playgroud)
我一直在摆弄Data.Type.Equality和Type.Reflection(如应用程序等),但我无法让它工作。任何人都有办法做到这一点?