如何将 Java 的 ArrayList 转换为 Apache Spark 的 Dataset?

4

我有一个类似这样的列表:

List<String> dataList = new ArrayList<>();
dataList.add("A");
dataList.add("B");
dataList.add("C");

我需要将Dataset<Row> dataDs = Seq(dataList).toDs();进行转换。

3个回答

5
List<String> data = Arrays.asList("abc", "abc", "xyz");
Dataset<String> dataDs = spark.createDataset(data, Encoders.STRING());
Dataset<String> dataListDs = spark.createDataset(dataList,    Encoders.STRING());
dataDs.show();

3
您可以按照以下方式将List<String>转换为Dataset<Row>
  1. List<String>中获取一个List<Object>,每个元素都具有正确的对象类。例如 - Integer、String等。

  2. List<Object>生成List<Row>

  3. 获取您想要用于Dataset<Row>模式的datatypeList和headerList。

  4. 构造模式对象:

  5. 创建数据集

List<Object> data = new ArrayList();
data.add("hello");
data.add(null);

List<Row> ls = new ArrayList<Row>();
Row row = RowFactory.create(data.toArray());
ls.add(row);

List<DataType> datatype = new ArrayList<String>();
datatype.add(DataTypes.StringType);
datatype.add(DataTypes.IntegerType);
List<String> header = new ArrayList<String>();
headerList.add("Field_1_string");
headerList.add("Field_1_integer");

StructField structField1 = new StructField(headerList.get(0), datatype.get(0), true, org.apache.spark.sql.types.Metadata.empty());

StructField structField2 = new StructField(headerList.get(1), datatype.get(1), true, org.apache.spark.sql.types.Metadata.empty());
List<StructField> structFieldsList = new ArrayList<>();
structFieldsList.add(structField1);
structFieldsList.add(structField2);

StructType schema = new StructType(structFieldsList.toArray(new StructField[0]));

Dataset<Row> dataset = sparkSession.createDataFrame(ls, schema);

dataset.show();
dataset.printSchema();

你的回答太棒了!非常感谢!对于想要解决这个问题的任何人,我的做法是:使用List<Row>来创建每个新的行,并将它们添加到该List<Row>中。然后使用该List<Row>来创建dataframe,而不是使用RDD来创建dataframe!太好了! - Aayush Shah

0

这是对我有效的派生答案。它受到了NiharGht答案的启发。

  • 假设我们有这样的列表(不运行,只是个想法)
List<List<Integer>> data = [
  [1, 2, 3],
  [2, 3, 4],
  [3, 4, 5]
];

现在需要将每个列表转换为行,以便可以用来创建数据框。
List<Row> rows = new ArrayList<>();
for (List<Integer> that_line : data){
    Row row = RowFactory.create(that_line.toArray());
    rows.add(row);
}

那就直接创建数据框吧!(不要使用RDD,而是使用List)
Dataset<Row> r2DF = sparkSession.createDataFrame(rows, schema); // supposing you have schema already.
r2DF.show();

关键问题在于这一行:

Dataset<Row> r2DF = sparkSession.createDataFrame(rows, schema);

通常情况下,我们在编程中使用RDD而不是列表。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接