创建不同变量类型的 DataFrame
Creating DataFrame of different variable types
我的原始数据如下所示:字符串后跟数字。
"cat",21,6,160,110,3.9,2.62,16.46,0,1,4,4
"dog",21,6,160,110,3.9,2.875,17.02,0,1,4,4
...
当我创建 RDD 和 DF 时,我想保留字符串并将其余部分转换为浮点数。所以我的 DF 的预期输出将有 12 列。第一列为字符串,其余为浮点数。
下面是我的代码:
def parse_line(line):
s = line.split(',')
name = s[0]
features = s[1:]
features = [float(x) for x in features]
return name, f
f = sc.textFile("animals.data")
rdd = f.map(parse_line)
df = sqlContext.createDataFrame(rdd)
输出只产生了两列:
+--------------------+--------------------+
| _1| _2|
+--------------------+--------------------+
| "cat"| [21.0, 6.0, 160.0...|
| "dog"| [21.0, 6.0, 160.0...|
| "rat"| [22.8, 4.0, 108.0...|
| "monkey"| [21.4, 6.0, 258.0...|
...
如果您的 animals.data
文件中的数据是同质的——特别是每一行都以您想要的字符串开头,然后是其他特征,每个特征用逗号分隔——您可能可以跳过整个parse_line
功能并让 pandas 为您完成。尝试以下两个功能之一:
df = pd.read_csv('animals.data')
或
df = pd.read_fwf('animals.data')
如果两者都不起作用,请 post 部分 animals.data 文件以便我们提供帮助。
选项 1: 函数 parse_line
return 是一个包含两个元素的元组:一个元素是名称,一个元素是 list 个特征。因此,数据框只有两列。要解决这个问题,parse_line
应该 return 一个包含 12 个元素的元组,其中所有元素都是浮点数或字符串:
def parse_line(line):
[...]
return (name,) + tuple(features)
选项 2: 您可以使用 Spark 以 CSV 格式读取数据,而无需使用 Pandas。在阅读之前定义 csv 的模式会很有帮助。这确保所有数字列都将被视为浮点数:
from pyspark.sql import types as T
schema = T.StructType([
T.StructField("col1", T.StringType(), True),
T.StructField("col2", T.FloatType(), True),
T.StructField("col3", T.FloatType(), True),
T.StructField("col4", T.FloatType(), True),
T.StructField("col5", T.FloatType(), True),
T.StructField("col6", T.FloatType(), True),
T.StructField("col7", T.FloatType(), True),
T.StructField("col8", T.FloatType(), True),
T.StructField("col9", T.FloatType(), True),
T.StructField("col10", T.FloatType(), True)])
df = spark.read.schema(schema).csv("test.csv")
对于这两个选项,结果将是一个包含 1 个字符串列和 11 个浮点列的 Spark 数据框。
我的原始数据如下所示:字符串后跟数字。
"cat",21,6,160,110,3.9,2.62,16.46,0,1,4,4
"dog",21,6,160,110,3.9,2.875,17.02,0,1,4,4
...
当我创建 RDD 和 DF 时,我想保留字符串并将其余部分转换为浮点数。所以我的 DF 的预期输出将有 12 列。第一列为字符串,其余为浮点数。
下面是我的代码:
def parse_line(line):
s = line.split(',')
name = s[0]
features = s[1:]
features = [float(x) for x in features]
return name, f
f = sc.textFile("animals.data")
rdd = f.map(parse_line)
df = sqlContext.createDataFrame(rdd)
输出只产生了两列:
+--------------------+--------------------+
| _1| _2|
+--------------------+--------------------+
| "cat"| [21.0, 6.0, 160.0...|
| "dog"| [21.0, 6.0, 160.0...|
| "rat"| [22.8, 4.0, 108.0...|
| "monkey"| [21.4, 6.0, 258.0...|
...
如果您的 animals.data
文件中的数据是同质的——特别是每一行都以您想要的字符串开头,然后是其他特征,每个特征用逗号分隔——您可能可以跳过整个parse_line
功能并让 pandas 为您完成。尝试以下两个功能之一:
df = pd.read_csv('animals.data')
或
df = pd.read_fwf('animals.data')
如果两者都不起作用,请 post 部分 animals.data 文件以便我们提供帮助。
选项 1: 函数 parse_line
return 是一个包含两个元素的元组:一个元素是名称,一个元素是 list 个特征。因此,数据框只有两列。要解决这个问题,parse_line
应该 return 一个包含 12 个元素的元组,其中所有元素都是浮点数或字符串:
def parse_line(line):
[...]
return (name,) + tuple(features)
选项 2: 您可以使用 Spark 以 CSV 格式读取数据,而无需使用 Pandas。在阅读之前定义 csv 的模式会很有帮助。这确保所有数字列都将被视为浮点数:
from pyspark.sql import types as T
schema = T.StructType([
T.StructField("col1", T.StringType(), True),
T.StructField("col2", T.FloatType(), True),
T.StructField("col3", T.FloatType(), True),
T.StructField("col4", T.FloatType(), True),
T.StructField("col5", T.FloatType(), True),
T.StructField("col6", T.FloatType(), True),
T.StructField("col7", T.FloatType(), True),
T.StructField("col8", T.FloatType(), True),
T.StructField("col9", T.FloatType(), True),
T.StructField("col10", T.FloatType(), True)])
df = spark.read.schema(schema).csv("test.csv")
对于这两个选项,结果将是一个包含 1 个字符串列和 11 个浮点列的 Spark 数据框。