如何使用 java 在 spark 中读取 xls 和 xlsx 文件?
how can I read xls and xlsx file in spark with java?
我想在 spark 中逐行读取 xls 和 xlsx (MS Excel) 文件,就像我们对文本文件所做的那样,或者如何?
我想使用 spark 来提高读取大型 xls 文件(比如 1 GB)的性能,这就是为什么我需要 spark 来像读取文本文件一样分段读取文件。
如何从 spark 中的 excel 个文件中读取数据,无论是否逐行读取?
我只想使用 spark 读取 xls 文件中的条目。
求推荐。
谢谢!!!
你不能用 spark
做到这一点。这不是为了它。使用其他库,例如Apache POI 读取 excel 然后将该数据作为文本提供给 spark。
您可以尝试使用 HadoopOffice 库将 read/write Excel 个文件与 Spark (https://github.com/ZuInnoTe/hadoopoffice/wiki) 相结合。它支持加密 Excel、链接工作簿、按元数据过滤 ...
虽然问题有点老,但我还是在回答。可能对其他人有用。
答案是肯定的,您可以使用 apache spark 2.x 来完成。假设您要将具有 3 列的 xls 转换为数据集。
class Bean {
private String col1;
private String col2;
private Timestamp col3;
}
StructType structType= new StructType(new StructField[] {
new StructField("col1", DataTypes.StringType, true, Metadata.empty()),
new StructField("col2", DataTypes.StringType, true, Metadata.empty()),
new StructField("col3", DataTypes.TimestampType, true, Metadata.empty())
});
Dataset<Bean> ds = sparkSession.read().
schema(structType).
format("com.crealytics.spark.excel").
option("useHeader", true). // If the xls file has headers
option("timestampFormat", "yyyy-MM-dd HH:mm:ss"). // If you want to convert timestamp to a specific format
option("treatEmptyValuesAsNulls", "false").
option("inferSchema", "false").
option("addColorColumns", "false").
load("/home/user/test/sample.xls"). //path to xls or xlsx
as(Encoders.bean(Bean.class)); // Bean in which you want to convert the data, you can remove this line if Dataset<Row> is just fine for you
这是我的做法。
在maven中添加依赖
<dependencies>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-core_2.11</artifactId>
<version>2.4.2</version>
</dependency>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-sql_2.11</artifactId>
<version>2.4.2</version>
</dependency>
<dependency>
<groupId>com.crealytics</groupId>
<artifactId>spark-excel_2.11</artifactId>
<version>0.11.1</version>
</dependency>
</dependencies>
我的主要class
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import org.apache.spark.sql.Dataset;
import org.apache.spark.sql.Row;
import org.apache.spark.sql.SparkSession;
public class ReadExcelSheets {
public static void main(String[] args) {
//skip logging extras
Logger.getLogger("org").setLevel(Level.ERROR);
//build session
SparkSession spark = SparkSession
.builder()
.appName("Java Spark SQL Example")
.config("spark.master", "local")
.getOrCreate();
//read excel - change file name
Dataset<Row> df = spark.read()
.format("com.crealytics.spark.excel")
.option("useHeader", "true")
//.option("dataAddress", "'Sheet1'!A1:M1470") // optional when you want to read sheets where A1 first top cell and M1470 us very bottom left of sheet.
.load("datasets/test1.xlsx");
//show your data
df.show();
}
}
我想在 spark 中逐行读取 xls 和 xlsx (MS Excel) 文件,就像我们对文本文件所做的那样,或者如何?
我想使用 spark 来提高读取大型 xls 文件(比如 1 GB)的性能,这就是为什么我需要 spark 来像读取文本文件一样分段读取文件。
如何从 spark 中的 excel 个文件中读取数据,无论是否逐行读取?
我只想使用 spark 读取 xls 文件中的条目。
求推荐。
谢谢!!!
你不能用 spark
做到这一点。这不是为了它。使用其他库,例如Apache POI 读取 excel 然后将该数据作为文本提供给 spark。
您可以尝试使用 HadoopOffice 库将 read/write Excel 个文件与 Spark (https://github.com/ZuInnoTe/hadoopoffice/wiki) 相结合。它支持加密 Excel、链接工作簿、按元数据过滤 ...
虽然问题有点老,但我还是在回答。可能对其他人有用。 答案是肯定的,您可以使用 apache spark 2.x 来完成。假设您要将具有 3 列的 xls 转换为数据集。
class Bean {
private String col1;
private String col2;
private Timestamp col3;
}
StructType structType= new StructType(new StructField[] {
new StructField("col1", DataTypes.StringType, true, Metadata.empty()),
new StructField("col2", DataTypes.StringType, true, Metadata.empty()),
new StructField("col3", DataTypes.TimestampType, true, Metadata.empty())
});
Dataset<Bean> ds = sparkSession.read().
schema(structType).
format("com.crealytics.spark.excel").
option("useHeader", true). // If the xls file has headers
option("timestampFormat", "yyyy-MM-dd HH:mm:ss"). // If you want to convert timestamp to a specific format
option("treatEmptyValuesAsNulls", "false").
option("inferSchema", "false").
option("addColorColumns", "false").
load("/home/user/test/sample.xls"). //path to xls or xlsx
as(Encoders.bean(Bean.class)); // Bean in which you want to convert the data, you can remove this line if Dataset<Row> is just fine for you
这是我的做法。
在maven中添加依赖
<dependencies>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-core_2.11</artifactId>
<version>2.4.2</version>
</dependency>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-sql_2.11</artifactId>
<version>2.4.2</version>
</dependency>
<dependency>
<groupId>com.crealytics</groupId>
<artifactId>spark-excel_2.11</artifactId>
<version>0.11.1</version>
</dependency>
</dependencies>
我的主要class
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import org.apache.spark.sql.Dataset;
import org.apache.spark.sql.Row;
import org.apache.spark.sql.SparkSession;
public class ReadExcelSheets {
public static void main(String[] args) {
//skip logging extras
Logger.getLogger("org").setLevel(Level.ERROR);
//build session
SparkSession spark = SparkSession
.builder()
.appName("Java Spark SQL Example")
.config("spark.master", "local")
.getOrCreate();
//read excel - change file name
Dataset<Row> df = spark.read()
.format("com.crealytics.spark.excel")
.option("useHeader", "true")
//.option("dataAddress", "'Sheet1'!A1:M1470") // optional when you want to read sheets where A1 first top cell and M1470 us very bottom left of sheet.
.load("datasets/test1.xlsx");
//show your data
df.show();
}
}