我开始使用Spark DataFrames,我需要能够透过数据来创建多列的1列中的多列.在Scalding中有内置的功能,我相信Python中的Pandas,但我找不到任何新的Spark Dataframe.
我假设我可以编写某种类型的自定义函数,但是我甚至不确定如何启动,特别是因为我是Spark的新手.我有人知道如何使用内置功能或如何在Scala中编写内容的建议,非常感谢.
我正试图在Spark中找出新的数据帧API.看起来好像是向前迈出了一大步,但却做了一件非常简单的事情.我有一个包含2列的数据框,"ID"和"Amount".作为一个通用示例,假设我想返回一个名为"code"的新列,该列返回基于"Amt"值的代码.我可以写一个像这样的函数:
def coder(myAmt:Integer):String {
if (myAmt > 100) "Little"
else "Big"
}
Run Code Online (Sandbox Code Playgroud)
当我尝试使用它时:
val myDF = sqlContext.parquetFile("hdfs:/to/my/file.parquet")
myDF.withColumn("Code", coder(myDF("Amt")))
Run Code Online (Sandbox Code Playgroud)
我得到类型不匹配错误
found : org.apache.spark.sql.Column
required: Integer
Run Code Online (Sandbox Code Playgroud)
我已经尝试将我的函数的输入类型更改为org.apache.spark.sql.Column但是我随后在函数编译时开始得到错误,因为它在if语句中需要一个布尔值.
我做错了吗?有没有比使用withColumn更好/另一种方法?
谢谢你的帮助.
我正在为某些测试手动创建数据帧.创建它的代码是:
case class input(id:Long, var1:Int, var2:Int, var3:Double)
val inputDF = sqlCtx
.createDataFrame(List(input(1110,0,1001,-10.00),
input(1111,1,1001,10.00),
input(1111,0,1002,10.00)))
Run Code Online (Sandbox Code Playgroud)
架构看起来像这样:
root
|-- id: long (nullable = false)
|-- var1: integer (nullable = false)
|-- var2: integer (nullable = false)
|-- var3: double (nullable = false)
Run Code Online (Sandbox Code Playgroud)
我想为这些变量中的每一个制作'nullable = true'.如何从一开始就声明它或在创建新数据帧后将其切换?
我试图通过一个以数组作为参数的函数来转换数据帧.我的代码看起来像这样:
def getCategory(categories:Array[String], input:String): String = {
categories(input.toInt)
}
val myArray = Array("a", "b", "c")
val myCategories =udf(getCategory _ )
val df = sqlContext.parquetFile("myfile.parquet)
val df1 = df.withColumn("newCategory", myCategories(lit(myArray), col("myInput"))
Run Code Online (Sandbox Code Playgroud)
但是,lit不喜欢数组和这个脚本错误.我尝试定义一个新的部分应用函数,然后是udf:
val newFunc = getCategory(myArray, _:String)
val myCategories = udf(newFunc)
val df1 = df.withColumn("newCategory", myCategories(col("myInput")))
Run Code Online (Sandbox Code Playgroud)
这不起作用,因为我得到一个nullPointer异常,并且看起来myArray未被识别.关于如何将数组作为参数传递给具有数据帧的函数的任何想法?
另外,关于为什么做一些简单的事情(比如在数据帧上使用函数)的任何解释都是如此复杂(定义函数,将其重新定义为UDF等等)?
scala user-defined-functions dataframe apache-spark apache-spark-sql
我发誓我以前做过这个,但我找不到代码或答案。我想获取当前运行的 SparkContext 的名称并将其读入变量或将其打印到屏幕上。类似的东西:
val myContext = SparkContext.getName
Run Code Online (Sandbox Code Playgroud)
例如,如果我在 spark-shell 中运行它,它将返回“sc”。有谁知道怎么得到吗?
我需要在读取数据文件后将一些字符串值转换为Ints.该字段可能为空,这会在尝试进行转换时导致错误.是否有一种简单的方法可以检查null(或者可以转换为整数的适当值),如果无法转换则只返回0?getOrElse似乎是一种可能性,但我不能完全理解写作.我可以写一个可以很容易地完成它的功能,但我希望有一个更优雅/简洁的方法来做到这一点.
这似乎应该很容易,但我不能把它放在一起.我想获取一个字符串列表并创建一个新列表,其中包含第一个列表中每个元素的两个但具有不同的后缀.所以:
List("a", "b", "c") -> List("a_x", "a_y", "b_x", "b_y", "c_x", "c_y"
Run Code Online (Sandbox Code Playgroud)
我试过了
val list2 = list1.map(i=> i+"_x", i+"_y")
Run Code Online (Sandbox Code Playgroud)
但斯卡拉说我的论点太多了.这很接近:
val list2 = list1.map(i=> (i+"_x", i+"_y"))
Run Code Online (Sandbox Code Playgroud)
但它产生了List(("a_x","a_y"),("b_x","b_y"),("c_x","c_y"))这不是我想要的.我敢肯定;我遗漏了一些明显的东西.
是否有可能编写一个Spark脚本,该脚本具有可以通过名称而不是args()数组中的索引引用的参数?我有一个脚本有4个必需的参数,根据这些参数的值,可能需要最多3个额外的参数.例如,在一种情况下,args(5)可能是我需要输入的日期.我是另一个,那个日期可能会因为我需要的另一个论点而最终出现在args(6)中.
烫伤实现了这一点,但我不知道Spark的作用.
这有点像理论上的问题,但我可能想做些什么.是否可以从Scala函数返回多个数据数据类型但限制允许的类型?我知道我可以通过指定它来返回一种类型,或者我基本上可以通过不指定返回类型来允许任何数据类型,但我想返回3种特定数据类型中的一种以保留一点类型安全性.有没有办法在返回类型中写'或',如:
def myFunc(input:String): [Int || String] = { ...}
Run Code Online (Sandbox Code Playgroud)
这个主要的上下文是尝试编写通用数据加载脚本.我的一些用户使用Spark,一些Scalding,谁知道接下来会发生什么.我希望我的用户能够使用可能返回RichPipe,RDD或其他一些数据格式的通用加载脚本,具体取决于他们使用的框架,但我不想完全抛弃类型安全性.