AWS EMR Spark - 从 S3 上的文件计算数字的平均值
AWS EMR Spark - calculate avg of numbers from file on S3
我正在尝试使用 AWS EMR 上的 Spark 计算 S3 上 txt 文件中给出的数字的平均值。
但是我不确定我应该使用 MLib 做什么?还是 sparkSQL?我看到的所有参考文献都是针对完全不同的事物。谁能指导我正确的方向?
SparkConf sparkConf = new
SparkConf().setAppName("com.company.app.JavaSparkPi");
JavaSparkContext jsc = new JavaSparkContext(sparkConf);
//READING S3 FILE
//PARSING THE FILE CREATING ARRAY OF NUMBERS
int slices = 2;
int n = 10 * slices;
List<Integer> l = new ArrayList<Integer>(n);
for (int i = 0; i < n; i++) {
l.add(i);
}
//NOT SURE WHAT TO DO HERE
//SHOULD I USE PARALLELIZE ??
JavaRDD<Integer> dataSet = jsc.parallelize(l, slices);
int count = dataSet.map(new Function<Integer, Integer>() {
@Override
public Integer call(Integer integer) {
//JUST MAP THE INTEGER TO INT?
//OR SOME LOGIC NEEDS TO BE PLACED
double x = Math.random() * 2 - 1;
double y = Math.random() * 2 - 1;
return (x * x + y * y < 1) ? 1 : 0;
}
}).reduce(new Function2<Integer, Integer, Integer>() {
@Override
public Integer call(Integer integer, Integer integer2) {
//SOME LOGIC HERE?
return integer + integer2;
}
});
//WRITE S3
System.out.println("Pi is roughly " + 4.0 * count / n);
jsc.stop();
您可能想要使用 Spark SQL
/DataFrame
功能。这些 API 为您提供 SQL 类转换,与较低级别的 RDD
API 相比,它们可为您提供更好的性能。 MLib
是Spark的机器学习组件,不需要做ETL操作,只有在训练新的ML模型时才需要。
你应该从阅读开始。首先,我将从一般的 spark 文档开始。这将使您了解如何将数据导入 Spark 作业并与之交互。
然后我会阅读电子病历。具体如何创建集群,以及如何访问spark shell:
Accessing Spark shell on EMR cluster
进入 spark shell 后,您将能够从 S3 加载数据,就像从 HDFS 加载数据一样。例如,对于简单的文本文件,您可以这样做(假设是 pyspark):
df = spark.read.text("s3://some-bucket/path/to/files/")
我正在尝试使用 AWS EMR 上的 Spark 计算 S3 上 txt 文件中给出的数字的平均值。
但是我不确定我应该使用 MLib 做什么?还是 sparkSQL?我看到的所有参考文献都是针对完全不同的事物。谁能指导我正确的方向?
SparkConf sparkConf = new
SparkConf().setAppName("com.company.app.JavaSparkPi");
JavaSparkContext jsc = new JavaSparkContext(sparkConf);
//READING S3 FILE
//PARSING THE FILE CREATING ARRAY OF NUMBERS
int slices = 2;
int n = 10 * slices;
List<Integer> l = new ArrayList<Integer>(n);
for (int i = 0; i < n; i++) {
l.add(i);
}
//NOT SURE WHAT TO DO HERE
//SHOULD I USE PARALLELIZE ??
JavaRDD<Integer> dataSet = jsc.parallelize(l, slices);
int count = dataSet.map(new Function<Integer, Integer>() {
@Override
public Integer call(Integer integer) {
//JUST MAP THE INTEGER TO INT?
//OR SOME LOGIC NEEDS TO BE PLACED
double x = Math.random() * 2 - 1;
double y = Math.random() * 2 - 1;
return (x * x + y * y < 1) ? 1 : 0;
}
}).reduce(new Function2<Integer, Integer, Integer>() {
@Override
public Integer call(Integer integer, Integer integer2) {
//SOME LOGIC HERE?
return integer + integer2;
}
});
//WRITE S3
System.out.println("Pi is roughly " + 4.0 * count / n);
jsc.stop();
您可能想要使用 Spark SQL
/DataFrame
功能。这些 API 为您提供 SQL 类转换,与较低级别的 RDD
API 相比,它们可为您提供更好的性能。 MLib
是Spark的机器学习组件,不需要做ETL操作,只有在训练新的ML模型时才需要。
你应该从阅读开始。首先,我将从一般的 spark 文档开始。这将使您了解如何将数据导入 Spark 作业并与之交互。
然后我会阅读电子病历。具体如何创建集群,以及如何访问spark shell:
Accessing Spark shell on EMR cluster
进入 spark shell 后,您将能够从 S3 加载数据,就像从 HDFS 加载数据一样。例如,对于简单的文本文件,您可以这样做(假设是 pyspark):
df = spark.read.text("s3://some-bucket/path/to/files/")