如何在sparkshellsql中读取带有数据的新表



我是spark shell的新手,我正在尝试添加新表并读取它。我已经添加了这个文件:

workers.txt:

1201, satish, 25
1202, krishna, 28
1203, amith, 39
1204, javed, 23
1205, prudvi, 23

并运行命令:

spark-shell
val sqlContext = new org.apache.spark.sql.hive.HiveContext(sc)
sqlContext.sql("CREATE TABLE workers (id INT, name VARCHAR(64), age INT)")
sqlContext.sql("LOAD DATA LOCAL INPATH 'workers.txt' INTO TABLE workers")
>> res5: org.apache.spark.sql.DataFrame = []
val resultW = sqlContext.sql("FROM workers SELECT *")
>> resultW: org.apache.spark.sql.DataFrame = [id: int, name: string ... 1 more field]
resultW.show()
>>
+----+----+----+                                                                
|  id|name| age|
+----+----+----+
|null|null|null|
|null|null|null|
|null|null|null|
|null|null|null|
|null|null|null|
+----+----+----+

但正如您所看到的,表中只有null,这是为什么呢?workers.txt文件位于同一工作目录中。

您在df中得到null的原因是因为spark:

默认情况下,行分隔符处理所有rrnn

这意味着你的线路,如

1201,satish,25

作为spark的值进行处理。

spark试图使其适合您声明的类型Int,这是不可能的,因为您的行包含","、空格和字符。这就是为什么它在所有地方都给出null值,但它有正确的行数。

对于您的案例,最好的方法是通过SparkSession方法阅读:

spark.read.option("delimiter", ",").csv("./workers.txt").show()

然后,您可以将其强制转换为您喜欢的类型,或者将其持久化为一个表:

val schema = new StructType()
.add("Id", IntegerType, true)
.add("Name", StringType, true)
.add("Age", IntegerType, true)
spark.read.option("delimiter", ",").schema(schema).csv("./workers.txt").write.option("path", "/some/path").saveAsTable("t")

然而,要注意你的文件内容,它在你的数字之前有前导空格,读者在解析它时会有问题

有关将数据帧保存到spark中的表的更多信息:

https://spark.apache.org/docs/latest/sql-data-sources-load-save-functions.html#saving-到持久表

相关内容

  • 没有找到相关文章

最新更新