【问题标题】:Scala -- Use evaluation of an expression to write dataframe to a csv fileScala - 使用表达式的评估将数据帧写入 csv 文件
【发布时间】:2019-01-30 10:19:50
【问题描述】:

这是使用表达式(字符串)的评估(Eval 或类似的东西)将数据帧写入 Scala 中的 csv 文件。

 import org.apache.spark.sql.{SaveMode, SparkSession, SQLContext, Row, DataFrame, Column}
 import scala.reflect.runtime.universe._
 import scala.tools.reflect.ToolBox
 import scala.reflect.runtime.currentMirror

 val df = Seq(("a", "b", "c"), ("a1", "b1", "c1")).toDF("A", "B", "C")
 val df_write = """df.coalesce(1).write.option("delimiter", "\u001F").csv("file:///var/tmp/test")"""

 // This is one of my failed attempts - I have tried using the interpreter as well (code not shown here).    
 val tb = runtimeMirror(getClass.getClassLoader).mkToolBox()  
 toolbox.eval(toolbox.parse(df_write))

 Errors are: 
 object coalesce is not a member of package df ....

【问题讨论】:

    标签: scala csv dataframe expression eval


    【解决方案1】:

    Shiva,试试下面的代码。问题是对象变量不在工具箱的范围内,因此无法计算表达式。

    package com.mansoor.test
    
    import org.apache.spark.sql.{DataFrame, SparkSession}
    
    object Driver extends App {
    
      def evalCode[T](code: String): T = {
        import scala.tools.reflect.ToolBox
        import scala.reflect.runtime.{currentMirror => m}
        val toolbox = m.mkToolBox()
        toolbox.eval(toolbox.parse(code)).asInstanceOf[T]
      }
    
      val sparkSession: SparkSession = SparkSession.builder().appName("Test")
        .master("local[2]")
        .getOrCreate()
    
      import sparkSession.implicits._
      val df: DataFrame = Seq(("a", "b", "c"), ("a1", "b1", "c1")).toDF("A", "B", "C")
    
      val df_write =
        s"""
           |import com.mansoor.test.Driver._
           |
           |df.coalesce(1).write.option("delimiter", "\u001F").csv("file:///var/tmp/test")
           """.stripMargin
    
      evalCode[Unit](df_write)
    
      sparkSession.sparkContext.stop()
    }
    

    【讨论】:

    • 谢谢。所有导入都已完成,并且可以将数据帧写入 csv,如您所确定的......但是,要求是能够评估字符串,并将数据帧写入 csv......跨度>
    • 再次感谢。是否有可能有一个函数将范围扩展到字符串内......或替代方法?
    • @Shiva 你能详细说明你的问题吗...你想在字符串中调用一个函数(或者)你想在字符串中声明一个函数并进一步使用它。
    • 与其拥有一个对象,不如调用一个函数来处理字符串中工具箱的范围(如果可能的话)...
    猜你喜欢
    • 1970-01-01
    • 2021-11-22
    • 2014-12-29
    • 2021-01-17
    • 1970-01-01
    • 1970-01-01
    • 2019-11-01
    • 1970-01-01
    • 2010-11-12
    相关资源
    最近更新 更多