我一直试图找到一种合理的方法来测试SparkSession
JUnit测试框架.虽然似乎有很好的例子SparkContext
,但我无法弄清楚如何使用相应的示例SparkSession
,即使它在spark-testing-base内部的几个地方使用过.我很乐意尝试一种不使用spark-testing-base的解决方案,如果它不是真正正确的方式去这里.
简单的测试用例(完整MWE项目有build.sbt
):
import com.holdenkarau.spark.testing.DataFrameSuiteBase
import org.junit.Test
import org.scalatest.FunSuite
import org.apache.spark.sql.SparkSession
class SessionTest extends FunSuite with DataFrameSuiteBase {
implicit val sparkImpl: SparkSession = spark
@Test
def simpleLookupTest {
val homeDir = System.getProperty("user.home")
val training = spark.read.format("libsvm")
.load(s"$homeDir\\Documents\\GitHub\\sample_linear_regression_data.txt")
println("completed simple lookup test")
}
}
Run Code Online (Sandbox Code Playgroud)
使用JUnit运行它的结果是加载线上的NPE:
java.lang.NullPointerException
at SessionTest.simpleLookupTest(SessionTest.scala:16)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
at …
Run Code Online (Sandbox Code Playgroud) 在Ubuntu 18.04更新之后我突然遇到问题:之前我在系统上没有问题地使用了docker,但突然间我不能.据我所知,权限看起来正确:
$ docker run hello-world
docker: Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Post http://%2Fvar%2Frun%2Fdocker.sock/v1.35/containers/create: dial unix /var/run/docker.sock: connect: permission denied.
See 'docker run --help'.
$ ls -last /var/run/docker.sock
0 srw-rw---- 1 root docker 0 Jul 14 09:10 /var/run/docker.sock
$ whoami
brandon
$ cat /etc/group | grep docker
docker:x:995:brandon
nvidia-docker:x:994:
Run Code Online (Sandbox Code Playgroud)
编辑:
集团信息:
$ groups
brandon
$ groups brandon
brandon : brandon adm cdrom sudo dip plugdev games lpadmin sambashare docker
$ whoami …
Run Code Online (Sandbox Code Playgroud) 我已经浏览了https://www.fpcomplete.com/blog/2017/06/tale-of-two-brackets,虽然略读了一些部分,但我仍然不太明白核心问题" StateT
不好,IO
是"好吧",除了模糊地感觉到Haskell允许一个人编写糟糕的StateT
monad(或者在文章的最终例子中,MonadBaseControl
而不是StateT
,我认为).
在黑线鳕中,必须满足以下法律:
askUnliftIO >>= (\u -> liftIO (unliftIO u m)) = m
Run Code Online (Sandbox Code Playgroud)
所以这似乎是说m
在使用时状态不会在monad中发生变异askUnliftIO
.但在我看来,IO
整个世界都可以成为国家.例如,我可以读写磁盘上的文本文件.
引用迈克尔的另一篇文章,
虚假纯度我们说WriterT和StateT是纯粹的,技术上它们是纯粹的.但是说实话:如果你有一个完全生活在StateT中的应用程序,你就不会从纯代码中获得你想要的限制突变的好处.也可以称之为铁锹,并接受你有一个可变变量.
这让我觉得情况确实如此:对于IO我们是诚实的,StateT
我们并不诚实可靠......但这似乎是上述法律试图表明的另一个问题; 毕竟,MonadUnliftIO
是假设IO
.我在概念上理解如何IO
比其他东西更具限制性.
更新1
睡觉后(有些人),我仍然感到困惑,但随着时间的推移逐渐减少.我制定了法律证据IO
.我意识到id
README中的存在.特别是,
instance MonadUnliftIO IO where
askUnliftIO = return (UnliftIO id)
Run Code Online (Sandbox Code Playgroud)
所以askUnliftIO
似乎会返回IO (IO a)
一个UnliftIO m
.
Prelude> fooIO = print 5
Prelude> :t fooIO
fooIO :: …
Run Code Online (Sandbox Code Playgroud) 在源modify
就被指出该操作将在地方,如果它是安全的话来进行,并会以其他方式修改载体的拷贝.
但是看代码modify
:
modify :: Vector v a => (forall s. Mutable v s a -> ST s ()) -> v a -> v a
modify p = new . New.modify p . clone
Run Code Online (Sandbox Code Playgroud)
它看起来clone
总是被调用(这对我来说很有意义,因为我认为它必须是对不可变向量的破坏性操作).
我误解了吗?如果没有,那么什么是clone
未调用的示例,以及如何Data.Vector
完成旁路?
Github 允许您在 wiki 页面中嵌入图像。
问题似乎是,对于私有存储库,访问图像的权限是由附加到 URL 的临时令牌决定的,如下所示:
https://media.githubusercontent.com/media/XYZ/MyProject/master/WikiMedia/Foo.png?token=XXXXXXXXXX-YYYYYYYYYYYYYYY-YYYYYYYYYYYYYYY
Run Code Online (Sandbox Code Playgroud)
该 URL 有效,但只是暂时的;有没有更稳定的方法?
我正在尝试在 Ubuntu 16.04 上使用 Nix。
\n\n设置完成后,我尝试构建以下表达式:
\n\nlet\n pkgs = import <nixpkgs> {};\n stdenv = pkgs.stdenv;\nin rec {\n scalaEnv = stdenv.mkDerivation rec {\n name = "scala-env";\n shellHook = \'\'\n alias cls=clear\n \'\';\n CLANG_PATH = pkgs.clang + "/bin/clang";\n CLANGPP_PATH = pkgs.clang + "/bin/clang++";\n buildInputs = with pkgs; [\n stdenv\n sbt\n openjdk\n boehmgc\n libunwind\n re2\n clang\n zlib\n ammonite\n ];\n };\n} \n
Run Code Online (Sandbox Code Playgroud)\n\n但这以错误结束:
\n\n*** Downloading \xe2\x80\x98https://cache.nixos.org/nar/022mrfa98hxccsn9znr9z9s7sh3kfc5wzvgfx45x5drcz9wq3wyv.nar.xz\xe2\x80\x99 to \xe2\x80\x98/nix/store/y1scdckyi7ij30771rl1pdq4s9gj683a-sbt-1.0.1\xe2\x80\x99...\n % Total % Received % Xferd Average Speed Time Time Time Current\n …
Run Code Online (Sandbox Code Playgroud) 请注意,这是一个社区帖子,应根据需要添加示例.如果您无法直接编辑添加示例(问题示例或解决方案)的答案,请在评论中发布带有要点(或类似内容)的链接或添加单独的答案,以便稍后进行集成.
Scala 3可能根本不包含scala.reflect.runtime
(Dotty目前没有,并且计划这样做不确定).虽然适用于Scala 2和Dotty的答案可能是转换目的和立即改进性能的首选,但也欢迎Dotty特定的解决方案.
https://www.cakesolutions.net/teamblogs/ways-to-pattern-match-generic-types-in-scala
标题有点不准确,因为我的特殊情况涉及更多点:与第一条记录中的函数不直接作用于第二条记录中的值相反,它们作用于值的列表(或其他可遍历)。可以假设,如果为某个特定领域申请的结果返回与该领域相同类型的值,那么这可以给我们带来任何好处。
例如:
data Foo = Foo {
v1 :: Int
, v2 :: Double
}
data FooFuns = FooFuns {
v1 :: [Int] -> Int
, v2 :: [Double] -> Double
}
Run Code Online (Sandbox Code Playgroud)
所以现在的目标是自动构建
result = Foo {
v1 = (v1 FooFuns) (v1 <$> listOfFoos)
, v2 = (v2 FooFuns) (v2 <$> listOfFoos)
}
Run Code Online (Sandbox Code Playgroud)
当前,我将该函数包装在值列表上,作为newtype
(可以被Higgledy的使用HKD
)和GADT用于Traversable约束,但是后一部分可能是不必要的,或者可能更好地建模为类型类:
data TraversableFun a t where
TraversableFun :: Traversable t => (t a -> a) -> TraversableFun t a
newtype ListFun …
Run Code Online (Sandbox Code Playgroud) 在下面的堆栈脚本中,我无法将strangeHeadMay
函数应用于NonEmpty
列表,但在常规列表上运行良好。
#!/usr/bin/env stack
{- stack script --nix --resolver lts-13.6 -}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE PartialTypeSignatures #-}
{-# OPTIONS_GHC -Wno-partial-type-signatures #-} -- hide some scary types
import Control.Arrow ((&&&))
import Control.Monad (join)
import Data.Foldable (toList)
import Data.Function ((&))
import Data.Functor ((<&>))
import Data.List.NonEmpty (NonEmpty(..))
import qualified Data.List.NonEmpty as LNE
import Data.Maybe (catMaybes)
import Data.Tuple.Sequence (sequenceT)
strangeHeadMay :: forall a t. (Semigroup (t a), _) => t a -> Maybe a
strangeHeadMay xs =
let xsWrapped …
Run Code Online (Sandbox Code Playgroud) 想要这样做的特殊原因是仍然能够对来自超类的值使用模式匹配。例如,我希望case None
在查看 type 的值时能够匹配Option[Throwable]
,但这似乎不可能,因为Throwable
不可能,而且(我想)永远不会有CanEqual
实例。
haskell ×4
scala ×3
apache-spark ×1
docker ×1
dotty ×1
git ×1
git-lfs ×1
github ×1
gollum-wiki ×1
junit ×1
nix ×1
nixpkgs ×1
scala-3 ×1
ubuntu-18.04 ×1
unit-testing ×1