小编Pau*_* Wu的帖子

为什么来自Oracle的Spark查询(加载)与SQOOP相比如此之慢?

我们发现,自Spark 1.3到现在的Spark 2.0.1,来自Oracle数据库的Spark API的加载数据一直很慢.典型的代码在Java中是这样的:

        Map<String, String> options = new HashMap<String, String>();
        options.put("url", ORACLE_CONNECTION_URL);
        options.put("dbtable", dbTable);
        options.put("batchsize", "100000");
        options.put("driver", "oracle.jdbc.OracleDriver");

        Dataset<Row> jdbcDF = sparkSession.read().options(options)
                .format("jdbc")
                .load().cache();
        jdbcDF.createTempView("my");

        //= sparkSession.sql(dbTable);
        jdbcDF.printSchema();
        jdbcDF.show();

        System.out.println(jdbcDF.count());
Run Code Online (Sandbox Code Playgroud)

我们的一位成员试图自定义这部分,他当时改进了很多(Spark 1.3.0).但Spark核心代码的某些部分成为Spark的内部代码,因此在版本之后无法使用.此外,我们看到HADOOP的SQOOP比Spark快得多(但它写入HDFS,需要大量的工作才能转换为数据集以供Spark使用).使用Spark的数据集写入方法写入Oracle似乎对我们有好处.令人费解的是为什么会这样!

oracle apache-spark apache-spark-sql spark-dataframe

9
推荐指数
1
解决办法
1811
查看次数

Spark SQL分组:如果你不关心你获得哪个值,可以添加到group by或wrap in first().

我在Spark SQL中有一个查询

select count(ts), truncToHour(ts)
from myTable
group by truncToHour(ts).
Run Code Online (Sandbox Code Playgroud)

哪里ts是时间戳类型,truncToHour是舍去时间戳小时UDF.此查询不起作用.如果我试试,

select count(ts), ts from myTable group by truncToHour(ts)
Run Code Online (Sandbox Code Playgroud)

我有expression 'ts' is neither present in the group by, nor is it an aggregate function. Add to group by or wrap in first() if you don't care which value you get.;,但first()如果我这样做,则没有定义:

select count(ts), first(ts) from myTable group by truncToHour(ts)
Run Code Online (Sandbox Code Playgroud)

无论如何在不使用子查询的情况下得到我想要的东西?另外,为什么它说"包装在first()"但是first()没有定义?

sql group-by apache-spark udf

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

如何为Spark SQL DataFrame Mapping构造ClassTag?

Spark SQL 1.2.0查询返回JavaRDD.Spark SQL 1.3.0查询返回DataFrame.通过DataFrame.toJavaRDD将DataFrame转换为JavaRDD似乎需要花费很多时间.我试图使用DataFrame.map()并遇到一个令人费解的问题:

DataFrame df = sqlSC.sql(sql);
RDD<String> rdd = df.map(new AbstractFunction1<Row, String> (){

        @Override
        public String apply(Row t1) {
            return t1.getString(0);
        }


    }, ?); 
Run Code Online (Sandbox Code Playgroud)

"?" 应该是scala.reflect.ClassTag.我使用了ClassManifestFactory.fromClass(String.class)并且它不起作用.我该怎么说"?".

顺便说一句,http://spark.apache.org/docs/1.3.0/sql-programming-guide.html与RDDs部分的Java代码部分给出的例子没有得到纠正:它使用了"map(new Function) (){"."函数"在那里是不可接受的.它应该是"Function1".

sql scala apache-spark rdd

5
推荐指数
2
解决办法
3807
查看次数