为什么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) 我怀疑这是我无法正确设置路径变量,但我不知所措.
我在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.在尝试修复我的路径变量之后,我感到很茫然.
任何建议表示赞赏
我正在尝试使用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)
问题
提前致谢。
编辑
无论出于什么原因……我最初的女士似乎都适合训练集,但是验证集在各个时期似乎都是很嘈杂的,经过几个时期后并没有任何实质性的改进。rmse似乎是有序下降的。。。直到改善了几十个纪元之后,损失才降到了inf。我可能会遇到比损失函数更大的问题。
编辑2-在下面添加我的实现@Patwie答案
啊!当然!!不幸的是,我正在使用tf …
我有一个 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) 我被 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)
虚拟数据
我真正关心的是 1 类的 IOU。在这种情况下,它应该是 7/9=0.778。我希望这会吐出的是每个班级的平均欠条......
数据
from keras import backend as K
import tensorflow as tf
import numpy as np
y_true …Run Code Online (Sandbox Code Playgroud) 从 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)
我的问题:
我刚刚进行了全新安装。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) 我正在从 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)
我的问题:如果我不使用SparkConf或SparkContext直接使用 Kryo,我在哪里注册课程?
我在这里看到spark.kryo.classesToRegister:https ://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) 我需要更新/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 权限执行引导操作。
好消息......但我不知道如何做到这一点,我找不到一个例子。
我尝试了很多东西......包括......
1=1 sudo bash /home/hadoop/myDir/myScript.sh我一直得到:
在主实例 (i-xxx) 上,引导操作 2 返回非零返回代码
如果我检查“设置 hadoop 调试”步骤的日志,那里什么也没有。
从这里:https : //docs.aws.amazon.com/emr/latest/ManagementGuide/emr-overview.html#emr-overview-cluster-lifecycle
总结 emr 设置(按顺序):
我正在尝试在AWS上的新Ubuntu 16.04计算机上安装SBT.我之前从未遇到过安装问题(以下说明),但我现在.
我得到这个错误......" 你所拥有的java安装不是最新的,至少要求1.6+版本,你有1.8版 "
似乎令人困惑,因为1.8似乎满足1.6+的要求.
引用
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) scala ×6
apache-spark ×3
amazon-emr ×2
hadoop ×2
java ×2
keras ×2
python ×2
sbt ×2
tensorflow ×2
aws-cli ×1
case-class ×1
cygwin ×1
gzip ×1
homebrew ×1
jar ×1
json ×1
kryo ×1
rdd ×1
spark-submit ×1
sudo ×1
ubuntu ×1