小编kmh*_*kmh的帖子

Apache Spark中的Case类相等

为什么Spark中的模式匹配与Scala中的模式匹配不一样?请参阅下面的示例...函数f()尝试在类上进行模式匹配,它在Scala REPL中工作但在Spark中失败并导致所有"???". f2()是一种解决方法,可以在Spark中获得所需的结果.isInstanceOf(),但我知道这是Scala中的错误形式.

任何帮助模式匹配Spark中这种情况下的正确方法将不胜感激.

abstract class a extends Serializable {val a: Int}
case class b(a: Int) extends a 
case class bNull(a: Int=0) extends a 

val x: List[a] = List(b(0), b(1), bNull())
val xRdd = sc.parallelize(x)
Run Code Online (Sandbox Code Playgroud)

尝试模式匹配在Scala REPL中工作但在Spark中失败

def f(x: a) = x match {
    case b(n) => "b"
    case bNull(n) => "bnull"
    case _ => "???"
}
Run Code Online (Sandbox Code Playgroud)

在Spark中运行的解决方法,但是形式不好(我认为)

def f2(x: a) = {
    if (x.isInstanceOf[b]) {
        "b"
    } else if (x.isInstanceOf[bNull]) {
        "bnull"
    } else …
Run Code Online (Sandbox Code Playgroud)

scala pattern-matching case-class apache-spark rdd

15
推荐指数
1
解决办法
2231
查看次数

cygwin中的aws cli - 如何清理windows和cygwin样式路径中的差异

我怀疑这是我无法正确设置路径变量,但我不知所措.

我在cygwin中使用pip安装了aws cli.

pip install awscli
Run Code Online (Sandbox Code Playgroud)

我有两个python环境......一个windows anaconda发行版,cygwin可以为你安装.

which python 
> /usr/bin/python

where python
> C:\cygwin64\bin\python
> C:\windows-style-path-to-anaconda\python.exe
Run Code Online (Sandbox Code Playgroud)

当我尝试运行aws cli时

aws --version
> C:\windows-style-path-to-anaconda\python.exe: can't open file 
> 'cygdrive/c/cygdrive-style-path-to-anaconda/Scripts/aws': 
> [Errno 2] No such file or directory'
Run Code Online (Sandbox Code Playgroud)

我已经尝试将aws的路径添加到我的windows路径变量中.没运气.

我已经尝试将其添加到我的.bashrc中

export PATH="$PATH:/cygdrive/c/cygdrive-style-path-to-anaconda/Scripts"
Run Code Online (Sandbox Code Playgroud)

没运气.

我试过修改python试图运行的'aws'.首先我修改了#!指向cygwin python而不是windows python.

#!c:\cygwin64\bin\python
Run Code Online (Sandbox Code Playgroud)

那么它可以找到文件'aws'来运行...但它找不到要导入的任何文件......'awscli.clidriver','botocore._'等.

我尝试修改我的路径变量以指向这些的位置... anaconda/Lib/site-packages ...我甚至尝试在'aws'文件本身中执行sys.path.insert(1,path). ..它解决了这个问题,但它加载的每一个文件都在其他地方查找而没有找到它们,并且在aws .py文件中一次搞乱一个太多的东西.

这是什么样的作品......在cygwin ......

cd /cygdrive/c/cygwin-path-to-anaconda/Scripts
./aws --version
> aws-cli/1.10.26 Python/2.7.11 Windows/7 botocore/1.4.17
Run Code Online (Sandbox Code Playgroud)

但必须有更好的方法,对吗?要么...

  • 让我的路径变量设置正确

  • 获取安装在cygwin python目录中的aws cli而不是windows anaconda环境

不幸的是,pip卸载只是挂起试图删除awscli,我不知道如果我甚至可以卸载/重新安装,如何强制它使用cygwin python.在尝试修复我的路径变量之后,我感到很茫然.

任何建议表示赞赏

python cygwin aws-cli

7
推荐指数
2
解决办法
3354
查看次数

用于360度预测的keras损失函数

我正在尝试使用keras / tensorflow预测方位角。y_true的范围是0-359,但是我需要一个损失函数来处理围绕该范围且超出该范围的预测。不幸的是,当我尝试任何类型的模块化除法tf.mod()或时%,我得到一个错误...

LookupError: No gradient defined for operation 'FloorMod' (op type: FloorMod)
Run Code Online (Sandbox Code Playgroud)

所以我想我已经通过以下方法解决了这个问题...

def mean_squared_error_360(y_true, y_pred):
  delta = K.minimum(K.minimum(K.abs(y_pred - y_true),
                              K.abs(y_pred - (360+y_true))),
                              K.abs(y_true - (360+y_pred)))
  return K.mean(K.square(delta), axis=-1)

def rmse_360(y_true, y_pred):
  return K.sqrt(mean_squared_error_360(y_true, y_pred))


model.compile(loss=mean_squared_error_360,
              optimizer=rmsprop(lr=0.0001),
              metrics=[rmse_360])
Run Code Online (Sandbox Code Playgroud)

这可以处理以下几种极端情况...我没有遇到<0的预测,所以我没有解决。

y =   1  y_pred = 361  err = 0
y = 359  y_pred =   1  err = 2
y = 359  y_pred = 361  err = 2
Run Code Online (Sandbox Code Playgroud)

问题

  • 这感觉笨拙;有没有更聪明的解决方案?
  • 凭直觉,我认为使用mean_squared_error和root_mean_squared_error之间的结果没有区别,因为损失...梯度会有所不同,但相同的最佳权重将同时解决这两个问题,对吗?有什么理由选择另一个吗?我猜mse比rmse稍微简单些,但这应该是微不足道的。我已经尝试过两者,并且使用rmse的“感觉”像比mse更有序地下降...那些平方误差的大小是否会使它跳得更多?

提前致谢。

编辑

无论出于什么原因……我最初的女士似乎都适合训练集,但是验证集在各个时期似乎都是很嘈杂的,经过几个时期后并没有任何实质性的改进。rmse似乎是有序下降的。。。直到改善了几十个纪元之后,损失才降到了inf。我可能会遇到比损失函数更大的问题。

编辑2-在下面添加我的实现@Patwie答案

啊!当然!!不幸的是,我正在使用tf …

conv-neural-network keras tensorflow

6
推荐指数
1
解决办法
1138
查看次数

AWS EMR Spark 集群 - 使用 Scala fat JAR 的步骤,找不到 MainClass

我有一个 fat jar,用 Scala 编写,由 sbt 打包。我需要在 AWS EMR 的 Spark 集群中使用它。

如果我手动启动集群,将 jar 复制到 master 并使用这样的命令运行 Spark-submit 作业,它的功能就很好......

spark-submit --class org.company.platform.package.SparkSubmit --name platform ./platform-assembly-0.1.0.jar arg0 arg1 arg2
Run Code Online (Sandbox Code Playgroud)

但是...如果我尝试将其作为步骤添加到 EMR 集群,则会失败。stderr 的日志看起来像这样......

Exception in thread "main" java.lang.ClassNotFoundException: package.SparkSubmit
  at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
  at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
  at java.security.AccessController.doPrivileged(Native Method)
  at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
  at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
  at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
  at java.lang.Class.forName0(Native Method)
  at java.lang.Class.forName(Class.java:278)
  at org.apache.hadoop.util.RunJar.run(RunJar.java:214)
  at org.apache.hadoop.util.RunJar.main(RunJar.java:136)
Run Code Online (Sandbox Code Playgroud)

我的 build.sbt 中的相关设置如下所示......

lazy val root = (project in file(".")).
  settings(
    name := "platform",
    version := "0.1.0",
    scalaVersion := "2.10.5", …
Run Code Online (Sandbox Code Playgroud)

scala jar executable-jar amazon-emr spark-submit

5
推荐指数
1
解决办法
2148
查看次数

tensorflow mean_iou - 如何获得一致的结果

我被 tensorflow 指标 mean_iou() 难住了。我尝试使用会导致对相同数据的结果不一致,而且我在任何地方都找不到有用的示例。

这篇博客文章讨论了这个问题......但我无法用这里的想法解决我的问题。 http://ronny.rest/blog/post_2017_09_11_tf_metrics/

最终目标是将validation_func(y_true, y_pred)arg 'metric' 作为参数传递给 Keras Model.compile() 方法。

最终目标

就像是...

def my_iou(y_true, y_pred):
  num_classes = 2
  score, update_op = tf.metrics.mean_iou(tf.argmax(y_true, axis=3), tf.argmax(y_pred, axis=3), num_classes)
  K.get_session().run(tf.local_variables_initializer())
  # K.get_session().run(tf.global_variables_initializer())
  with tf.control_dependencies([update_op]):
    final_score = tf.identity(score)
  return final_score
Run Code Online (Sandbox Code Playgroud)

虚拟数据

  • 尺寸将是:(批次,高度,宽度,num_classes)
  • 第 1 类 - 前景对象;我想分割的东西
  • 0级 - 背景

我真正关心的是 1 类的 IOU。在这种情况下,它应该是 7/9=0.778。我希望这会吐出的是每个班级的平均欠条......

  • 借条 0 类:0/2=0
  • 借条 1 级:7/9=0.778
  • 总体:平均(iou_0,iou_1)=0.3889

数据

from keras import backend as K
import tensorflow as tf
import numpy as np

y_true …
Run Code Online (Sandbox Code Playgroud)

python image-segmentation keras tensorflow

5
推荐指数
0
解决办法
1301
查看次数

从火花保存压缩的json

从 Spark RDD 开始,我想将 JSON 数据暂存并存档到 AWS S3。只有压缩它才有意义,而且我有一个使用 hadoop 的进程GzipCodec,但是有些事情让我对此感到紧张。

当我查看org.apache.spark.rdd.RDD.saveAsTextFile这里的类型签名时:

https://spark.apache.org/docs/2.3.0/api/scala/index.html#org.apache.spark.rdd.RDD

类型签名是:

def saveAsTextFile(path: String, codec: Class[_ <: CompressionCodec]): Unit
Run Code Online (Sandbox Code Playgroud)

但是当我在这里检查可用的压缩编解码器时:

https://spark.apache.org/docs/2.3.0/api/scala/index.html#org.apache.spark.io.CompressionCodec

父特征CompressionCodec和子类型都说:

编解码器的有线协议不能保证跨版本的 Spark 兼容。这旨在用作单个 Spark 应用程序中的内部压缩实用程序

这不好……但没关系,因为无论如何,gzip 可能更容易跨生态系统处理。

类型签名说,编解码器必须是一个亚型CompressionCodec......但我尝试了以下另存为。广州,并能正常工作,即使Hadoop的GzipCodec不是<: CompressionCodec

import org.apache.hadoop.io.compress.GzipCodec
rdd.saveAsTextFile(bucketName, classOf[GzipCodec])
Run Code Online (Sandbox Code Playgroud)

我的问题:

  • 这是有效的,但是有什么理由不这样做……或者有更好的方法吗?
  • 与内置的压缩​​编解码器不同,这在 Spark 版本(和其他地方)中是否会很健壮?

json gzip hadoop scala apache-spark

5
推荐指数
1
解决办法
2456
查看次数

sbt 无法正确安装;自制软件改变java版本

我刚刚进行了全新安装。jdk 8(来自 Adoptium.net)和 sbt(使用自制软件)在新镜像的 MacBook 上。无论如何,自制程序使用了 java 18,而 sbt 不起作用。

我按照这里的说明进行操作: https ://www.scala-sbt.org/1.x/docs/Installing-sbt-on-Mac.html

通过该页面上的 Adoptium.net 链接,我找到了唯一适用于 macOS 的 jdk 8。

$ java -version
openjdk version "1.8.0_322"
OpenJDK Runtime Environment (Temurin)(build 1.8.0_322-b06)
OpenJDK 64-Bit Server VM (Temurin)(build 25.322-b06, mixed mode)
Run Code Online (Sandbox Code Playgroud)

按照 sbt 页面上的说明,我使用了自制程序......

$ brew install sbt
Run Code Online (Sandbox Code Playgroud)

当我检查版本时,我发现一个问题......

$ sbt about
[info] welcome to sbt 1.6.2 (Homebrew Java 18)
[info] loading project definition from /Users/KHinson1/project
[info] set current project to khinson1 (in build file:/Users/KHinson1/)
[info] This is sbt 1.6.2
[info] The …
Run Code Online (Sandbox Code Playgroud)

java homebrew scala sbt

5
推荐指数
1
解决办法
4618
查看次数

在 Spark 2+ 中通过 SparkSession 向 Kryo 注册类

我正在从 Spark 1.6 迁移到 2.3。

我需要向 Kryo 注册自定义类。所以我在这里看到的是: https: //spark.apache.org/docs/2.3.1/tuning.html#data-serialization

val conf = new SparkConf().setMaster(...).setAppName(...)
conf.registerKryoClasses(Array(classOf[MyClass1], classOf[MyClass2]))
val sc = new SparkContext(conf)
Run Code Online (Sandbox Code Playgroud)

问题是... Spark 2+ 指令中的其他地方,它表明这SparkSession是解决所有问题的方法...并且如果您需要SparkContext它应该通过spark.sparkContext而不是作为独立的 val。

所以现在我使用以下内容(并从我的代码中擦除了conf、sc等的任何痕迹)...

val spark = SparkSession.builder.appName("myApp").getOrCreate()
Run Code Online (Sandbox Code Playgroud)

我的问题:如果我不使用SparkConfSparkContext直接使用 Kryo,我在哪里注册课程?

我在这里看到spark.kryo.classesToRegisterhttps ://spark.apache.org/docs/2.3.1/configuration.html#compression-and-serialization

我有一个相当广泛的conf.json设置spark-defaults.conf,但我想让它在应用程序之间通用,所以我不想在这里注册类。

当我看这里时: https://spark.apache.org/docs/2.3.1/api/scala/index.html#org.apache.spark.sql.SparkSession

这让我觉得我可以做如下的事情来增强我的spark-defaults.conf

val spark = 
  SparkSession
    .builder
    .appName("myApp")
    .config("spark.kryo.classesToRegister", "???")
    .getOrCreate()
Run Code Online (Sandbox Code Playgroud)

???但如果我想注册怎么办org.myorg.myapp.{MyClass1, MyClass2, MyClass3}?我找不到这种用法的示例。

可不可能是:

.config("spark.kryo.classesToRegister", "MyClass1,MyClass2,MyClass3")
Run Code Online (Sandbox Code Playgroud)

或者

.config("spark.kryo.classesToRegister", …
Run Code Online (Sandbox Code Playgroud)

scala kryo apache-spark

4
推荐指数
1
解决办法
3128
查看次数

AWS EMR 引导操作作为 sudo

我需要更新/etc/hosts我的 EMR 集群 (EMR AMI 4.3) 中的所有实例。

整个脚本无非是:

#!/bin/bash
echo -e 'ip1 uri1' >> /etc/hosts
echo -e 'ip2 uri2' >> /etc/hosts
...
Run Code Online (Sandbox Code Playgroud)

此脚本需要按原样运行,sudo否则将失败。

从这里:https : //docs.aws.amazon.com/emr/latest/ManagementGuide/emr-plan-bootstrap.html#bootstrapUses

默认情况下,引导操作以 Hadoop 用户身份执行。您可以使用sudo以 root 权限执行引导操作。

好消息......但我不知道如何做到这一点,我找不到一个例子。

我尝试了很多东西......包括......

  • 作为 Hadoop 运行并在脚本中的每个“echo”语句中添加“sudo”
  • 使用 shell 脚本复制和修改上述内容(没有 'sudo' 的 'echo' 语句)并使用调用的 run-if 引导程序运行本地副本 1=1 sudo bash /home/hadoop/myDir/myScript.sh
  • 将整个脚本作为单行硬编码到 run-if 引导操作中

我一直得到:

在主实例 (i-xxx) 上,引导操作 2 返回非零返回代码

如果我检查“设置 hadoop 调试”步骤的日志,那里什么也没有。

从这里:https : //docs.aws.amazon.com/emr/latest/ManagementGuide/emr-overview.html#emr-overview-cluster-lifecycle

总结 emr 设置(按顺序):

  1. 规定ec2实例
  2. 运行引导操作
  3. 安装本机应用程序……例如hadoop、 …

sudo hadoop amazon-web-services amazon-emr

3
推荐指数
1
解决办法
4253
查看次数

在新的ubuntu机器上安装jdk/sbt

我正在尝试在AWS上的新Ubuntu 16.04计算机上安装SBT.我之前从未遇到过安装问题(以下说明),但我现在.

我得到这个错误......" 你所拥有的java安装不是最新的,至少要求1.6+版本,你有1.8版 "

似乎令人困惑,因为1.8似乎满足1.6+的要求.

引用

scala - https://www.scala-lang.org/documentation/getting-started-sbt-track/getting-started-with-scala-and-sbt-on-the-command-line.html

sbt - http://www.scala-sbt.org/1.0/docs/Installing-sbt-on-Linux.html

sudo apt-get update 

java -version
# The program 'java' can be found in the following packages:
#  * default-jre
#  * gcj-5-jre-headless
#  * openjdk-8-jre-headless
#  * gcj-4.8-jre-headless
#  * gcj-4.9-jre-headless
#  * openjdk-9-jre-headless
# Try: sudo apt install <selected package>

sudo apt-get install openjdk-8-jdk -y

java -version
# openjdk version "1.8.0_151"
# OpenJDK Runtime Environment (build 1.8.0_151-8u151-b12-0ubuntu0.16.04.2-b12)
# OpenJDK 64-Bit Server VM (build 25.151-b12, mixed mode) …
Run Code Online (Sandbox Code Playgroud)

java ubuntu scala sbt

2
推荐指数
1
解决办法
566
查看次数