【问题标题】:How to convert the datasets of Spark Row into string?如何将 Spark Row 的数据集转换为字符串?
【发布时间】:2017-07-12 08:49:03
【问题描述】:

我已经编写了使用 SparkSQL 访问 Hive 表的代码。这是代码:

SparkSession spark = SparkSession
        .builder()
        .appName("Java Spark Hive Example")
        .master("local[*]")
        .config("hive.metastore.uris", "thrift://localhost:9083")
        .enableHiveSupport()
        .getOrCreate();
Dataset<Row> df =  spark.sql("select survey_response_value from health").toDF();
df.show();

我想知道如何将完整的输出转换为字符串或字符串数​​组?当我尝试使用另一个模块时,只有我可以传递字符串或字符串类型的数组值。
我尝试过其他方法,例如 .toString 或类型转换为字符串值。但对我没有用。
请告诉我如何将 DataSet 值转换为字符串?

【问题讨论】:

    标签: java string apache-spark apache-spark-sql apache-spark-dataset


    【解决方案1】:

    这里是 Java 中的示例代码。

    public class SparkSample {
        public static void main(String[] args) {
            SparkSession spark = SparkSession
                .builder()
                .appName("SparkSample")
                .master("local[*]")
                .getOrCreate();
        //create df
        List<String> myList = Arrays.asList("one", "two", "three", "four", "five");
        Dataset<Row> df = spark.createDataset(myList, Encoders.STRING()).toDF();
        df.show();
        //using df.as
        List<String> listOne = df.as(Encoders.STRING()).collectAsList();
        System.out.println(listOne);
        //using df.map
        List<String> listTwo = df.map(row -> row.mkString(), Encoders.STRING()).collectAsList();
        System.out.println(listTwo);
      }
    }
    

    "row" 是 java 8 的 lambda 参数。请查看developer.com/java/start-using-java-lambda-expressions.html

    【讨论】:

    • 请您解释一下程序中的row 是什么?你的代码对我来说看起来很优化。
    • "row" 是 java 8 lambda 参数。请查看developer.com/java/start-using-java-lambda-expressions.html
    • 完美。谢谢。
    • 我在使用 df.as 时收到此错误。线程 "main" org.apache.spark.sql.AnalysisException 中的异常:尝试将 struct 映射到 Tuple1,但由于字段数未对齐而失败。;跨度>
    【解决方案2】:

    您可以使用map 函数将每一行转换为字符串,例如:

    df.map(row => row.mkString())
    

    除了mkString,你当然可以做更复杂的工作

    collect 方法然后可以将整个内容检索到一个数组中

    val strings = df.map(row => row.mkString()).collect
    

    (这是Scala的语法,我认为在Java中很相似)

    【讨论】:

    • 没用,我的朋友。你能帮我用java而不是Scala吗?我知道语法有点相似,但是当我们使用 java 而不是 Scala 时还有其他问题
    • @Jaffer Java8 语法应该很相似
    • @cricket_007 感谢您的建议。它有帮助。
    • 这是否适用于具有多列的行。或者我们需要行编码器等
    • 它也适用于多列的行。您还可以将分隔符字符串传递给mkString 以分隔列。
    【解决方案3】:

    如果您打算逐行读取数据集,则可以在数据集上使用迭代器:

     Dataset<Row>csv=session.read().format("csv").option("sep",",").option("inferSchema",true).option("escape, "\"").option("header", true).option("multiline",true).load(users/abc/....);
    
    for(Iterator<Row> iter = csv.toLocalIterator(); iter.hasNext();) {
        String item = (iter.next()).toString();
        System.out.println(item.toString());    
    }
    

    【讨论】:

      【解决方案4】:

      作为单个字符串,从 sparkSession 你可以这样做:

      sparkSession.read.textFile(filePath).collect.mkString
      

      假设您的数据集是字符串类型:Dataset[String]

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-09-13
        • 2020-02-06
        • 2018-09-24
        • 1970-01-01
        • 2016-05-09
        • 2018-02-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多