spark定制之二:start.scala中的DSL

通过类的隐式转换可以让写脚本变得更容易(写入"select * from testperson" hqlgo直接处结果,"select * from testperson" saveto somefile直接写入文件):

def getRegisterString(rddname:String,classname:String,tablename:String,tabledef:String) : String = {
    val members = tabledef.split(",").map(_.trim.split(" ").filter(""!=)).map(x => (x(0).trim,x(1).trim.head.toString.toUpperCase+x(1).trim.tail))
    val classmemberdef = members.map(x => (x._1+":"+x._2)).mkString(",")
    val convertstr = members.map(x => x._2).zipWithIndex.map(x => "t("+x._2+").to"+x._1).mkString(",")
    return s"""
        case class ${classname}(${classmemberdef})
        val schemardd = ${rddname}.map(_.split("${FIELD_SEPERATOR}")).map(t=>${classname}(${convertstr}))
        hive.registerRDDAsTable(schemardd,"${tablename}")
    """
}

org.apache.spark.repl.Main.interp.command("""
class CommandTranslator(cmd:String) extends java.io.Serializable {

    def hqlgo()(implicit f: SchemaRDD => MySchemaRDD) = {
        lastrdd = hql(cmd)
        lastrdd.go()
    }

    def hqlsaveto(output: String)(implicit f: SchemaRDD => MySchemaRDD) = {
        lastrdd = hql(cmd)
        lastrdd.saveto(output)
    }

    def defineas(tabledef:String) = {
        if( tabledef != "" ) {
            org.apache.spark.repl.Main.interp.command(
                getRegisterString(cmd,cmd.toUpperCase,cmd,tabledef)
            )
        } else {
            org.apache.spark.repl.Main.interp.command(
                "hive.registerRDDAsTable(${cmd},\"${cmd}\")"
            )
        }
    }

    def from(filepath:String) {
        if( cmd.startsWith("create table ") ) {
            val tablename = cmd.substring(13).trim().split(" ")(0)
            val leftstr = cmd.substring(13).trim().substring(tablename.length).trim()
            val tabledef = leftstr.substring(1,leftstr.length-1).trim()
            val realfile = AutoFileUtil.regularFile(filepath)
            org.apache.spark.repl.Main.interp.command(
                "val "+tablename+" = sc.textFile(\""+realfile+"\")"
            )
            new CommandTranslator(tablename).defineas(tabledef)
        } else {
            println("usage:")
            println("\"create table sometablename (field1 string,field2 int...)\" from \"somefile or hdfs:somepath\"")
        }
    }
}
object CommandTranslator {
    implicit def stringToTranslator(cmd:String) = new CommandTranslator(cmd)

    def show(tabledata:Array[org.apache.spark.sql.Row]) = {
        tabledata.foreach( x => println(x.mkString("\t")))
    }
}
""")

def auto = CommandTranslator
import CommandTranslator._


def help = {
    println("""example:
        "select * from testperson" hqlgo
        "select * from testperson" hqlsaveto "hdfs://somedir"
        "select * from testperson" hqlsaveto "somelocalfile"
        "create table sometable (name string,age int,weight double)" from "hdfs:/test/testperson"
        auto show hqlresult
        "somerdddata" defineas "(name string,age int)"
        if you want to see the help of enveronment, please type :help
        """)
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值