我必须将文件读为spark
到databricks
(bytes
)中,然后将其转换为字符串。
file_bytes.decode("utf-8")
这一切都很好,我有我的数据,用竖线分隔的字符串(包括回车符等)看起来都很不错。像这样:
"Column1"|"Column2"|"Column3"|"Column4"|"Column5"
"This"|"is"|"some"|"data."|
"Shorter"|"line."|||
尽管我希望在dataframe
中使用它,以便可以对其进行操作,但最初我尝试使用以下内容:
df = sqlContext.read.format("csv")
.option("header", "true")
.option("inferSchema", "true")
.option("delimiter", '|')
.load(???)
我很感激load()
部分实际上是通往filesystem
上某个位置的路径...因此一直在努力与之搏斗。
因此,我已恢复使用pandas
,因为它使生活变得更加轻松:
import io
import pandas
temp = io.StringIO(file_bytes.decode("utf-8"))
df = pandas.read_csv(temp, sep="|")
这是pandas
dataframe
,而不是spark
dataframe
,据我所知(这是一个非常宽松的认识),它有其优点和缺点与它的生存位置(在内存中)有关,与可伸缩性/集群使用等有关。
最初,我是否有办法使用spark
将我的字符串放入dataframe
sqlContext
中?也许我缺少一些参数或开关等,还是应该坚持使用pandas
?
我主要担心的是,现在文件很小(200 kb左右),但它们可能不会永远存在,我想重用一种模式,使我可以处理更大的事情(这就是为什么我只关心使用熊猫的原因。)
答案 0 :(得分:3)
您实际上可以使用CSV阅读器加载字符串的RDD。
http://spark.apache.org/docs/latest/api/python/pyspark.sql.html#pyspark.sql.DataFrameReader
因此,假设lines
是您描述的解析字符串的RDD,则可以运行:
df = spark.read.csv(lines, sep='|', header=True, inferSchema=True)
然后CSV源将扫描RDD,而不是尝试加载文件。这样一来,您就可以在解析之前执行自定义的预处理。