我在亚马逊s3上有一个大小为62MB的csv文件(114,000行)。我正在将其转换为Spark数据集,并从中取出前500行。代码如下:
DataFrameReader df = new DataFrameReader(spark).format("csv").option("header", true);
Dataset<Row> set=df.load("s3n://"+this.accessId.replace("\"", "")+":"+this.accessToken.replace("\"", "")+"@"+this.bucketName.replace("\"", "")+"/"+this.filePath.replace("\"", "")+"");
set.take(500)
整个操作需要20到30秒钟。
现在我正在尝试相同的操作,但不是使用csv,而是使用包含119000行的MySQL表。MySQL服务器位于Amazon EC2上。代码如下:
String url ="jdbc:mysql://"+this.hostName+":3306/"+this.dataBaseName+"?user="+this.userName+"&password="+this.password;
SparkSession spark=StartSpark.getSparkSession();
SQLContext sc = spark.sqlContext();
DataFrameReader df = new DataFrameReader(spark).format("csv").option("header", true);
Dataset<Row> set = sc
.read()
.option("url", url)
.option("dbtable", this.tableName)
.option("driver","com.mysql.jdbc.Driver")
.format("jdbc")
.load();
set.take(500);
这需要5到10分钟的时间。我正在jvm中运行spark。在两种情况下都使用相同的配置。
我可以使用partitionColumn,numParttition等参数,但我没有任何数字列,并且另一个问题是表的架构对我来说是未知的。
我的问题不是如何减少所需的时间,因为我知道在理想情况下,spark将在集群中运行,但我无法理解为什么上述两种情况存在如此大的时间差异?
DataFrameReader df = new DataFrameReader(spark).format("csv").option("header", true);
真的必要吗? - Adonis