返回信息流我看网上将RDD转化为DataFrame的方法主要有两种,一种是创建RDD时从文件或其它地方读取它的schema,另一种是手动定义它的schema.但不管怎么说,都得知道它的schema.有没有什么不需要知道RDD的schema就能将它转换为DataFrame的方式吗?
这是一条镜像帖。来源:北邮人论坛 / ml-dm / #34973同步于 2019/8/16
该镜像源已超过 30 天没有更新,可能在源站已被删除。
ML_DM机器人发帖
如何在不知道schema的情况下将RDD转化为DataFrame
PMS
2019/8/16镜像同步11 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
不会bd额,希望有大佬来讨论一下
inferSchema貌似也需要case class的Row才能识别吧,相当于你还是要知道schema。比较好奇未知schema要拿dataframe用来干嘛⊙?⊙?
通过『我邮2.0』发布
rdd本身就是low level api吧,只存具体的数据结构,不带schema信息,所以需要你自己定义schema,当然也可以让spark去推断,引入import sqlContext.implicits._ ,然后调用rdd的toDF方法应该就ok了
【 在 PMS 的大作中提到: 】
: 我看网上将RDD转化为DataFrame的方法主要有两种,一种是创建RDD时从文件或其它地方读取它的schema,另一种是手动定义它的schema.但不管怎么说,都得知道它的schema.有没有什么不需要知道RDD的schema就能将它转换为DataFrame的方式吗?
def main(args: Array[String]): Unit = {
val spark = SparkSession
.builder()
.appName("dataread")
.master("local")
.getOrCreate()
//***************************定义区*********************************//
//输入表名
val tablename = "D:\\WorkSpace\\database\\preprocess\\data2.csv"
//输入数据
val data = "D:\\WorkSpace\\database\\preprocess\\data3.csv"
//合并后的输出(暂时没用)
val out = "D:\\WorkSpace\\database\\1"
//输入表名的间隔符号
val septable = " "
//输入数据的间隔符号
val sepdata = " "
//空值表示符号
val nullValue = "?"
//***************************功能区*********************************//
//读入表名
val tn = spark.sparkContext.textFile(tablename)
val fields = tn.first().split(septable).map(m => StructField(m, StringType))
val tableschema = StructType(fields)
//组装dataframe
var df = spark.read.format("csv")
.option("sep", sepdata)
.schema(tableschema)
.option("nullValue", nullValue)
.load(data)
df.show()
}
schema()和option()不是必须的