我试图将Spark RDD转换为DataFrame.我已经看到了将方案传递给sqlContext.CreateDataFrame(rdd,schema)函数的文档和示例
.
但我有38列或字段,这将进一步增加.如果我手动给出指定每个字段信息的模式,那将会是如此繁琐的工作.
有没有其他方法可以在不知道先前列的信息的情况下指定模式.
我正在使用分类数据在Spark DataFrame上进行数据准备.我需要对分类数据进行One-Hot-Encoding,我在spark 1.6上尝试了这个
sqlContext = SQLContext(sc)
df = sqlContext.createDataFrame([
(0, "a"),
(1, "b"),
(2, "c"),
(3, "a"),
(4, "a"),
(5, "c")
], ["id", "category"])
stringIndexer = StringIndexer(inputCol="category", outputCol="categoryIndex")
model = stringIndexer.fit(df)
indexed = model.transform(df)
encoder = OneHotEncoder(dropLast=False, inputCol="categoryIndex", outputCol="categoryVec")
encoded = encoder.transform(indexed)
encoded.select("id", "categoryVec").show()
Run Code Online (Sandbox Code Playgroud)
这段代码产生了这种格式的单热编码数据.
+---+-------------+
| id| categoryVec|
+---+-------------+
| 0|(3,[0],[1.0])|
| 1|(3,[2],[1.0])|
| 2|(3,[1],[1.0])|
| 3|(3,[0],[1.0])|
| 4|(3,[0],[1.0])|
| 5|(3,[1],[1.0])|
+---+-------------+
Run Code Online (Sandbox Code Playgroud)
通常,我对One-Hot编码技术的期望是每个类别的每列和0,1个相应的值.如何从中获取这类数据?
apache-spark apache-spark-sql pyspark apache-spark-mllib one-hot-encoding
我正在处理数据,试图查看两个变量之间的关联,并在 Python 的 Scipy 包中使用卡方分析。
这是两个变量的交叉表结果:
pd.crosstab(data['loan_default'],data['id_proofs'])
Run Code Online (Sandbox Code Playgroud)
结果:
id_proofs 2 3 4 5
loan_default
0 167035 15232 273 3
1 46354 4202 54 1
Run Code Online (Sandbox Code Playgroud)
如果我对相同的数据应用卡方,我会看到一条错误:ValueError:内部计算的预期频率表在 (0,) 处有一个零元素。
代码:
from scipy.stats import chi2_contingency
stat,p,dof,expec = chi2_contingency(data['loan_default'],data['id_proofs'])
print(stat,p,dof,expec)
Run Code Online (Sandbox Code Playgroud)
错误报告:
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-154-63c6f49aec48> in <module>()
1 from scipy.stats import chi2_contingency
----> 2 stat,p,dof,expec = chi2_contingency(data['loan_default'],data['id_proofs'])
3 print(stat,p,dof,expec)
~/anaconda3/lib/python3.6/site-packages/scipy/stats/contingency.py in chi2_contingency(observed, correction, lambda_)
251 zeropos = list(zip(*np.where(expected == 0)))[0]
252 raise ValueError("The internally computed table of expected "
--> …Run Code Online (Sandbox Code Playgroud) 我正在使用scrapy 来抓取一些网页。我编写了自定义的ProxyMiddleware类,其中在process_request(self,request,spider)方法中实现了我的要求。这是我的代码(复制):
class ProxyMiddleware(scrapy.downloadermiddlewares.httpproxy):
def __init__(self, proxy_ip=''):
self.proxy_ip = proxy_ip
def process_request(self,request,spider):
ip = random.choice(self.proxy_list)
if ip:
request.meta['proxy'] = ip
return request
proxy_list = [list of proxies]
Run Code Online (Sandbox Code Playgroud)
现在,我不明白scrapy 将如何考虑我的实现而不是默认类。经过一番搜索和头脑风暴,我的理解是,我需要在settings.py中进行更改
DOWNLOADER_MIDDLEWARES = {
'IPProxy.middlewares.MyCustomDownloaderMiddleware': 543,
'IPProxy.IPProxy.spiders.RandomProxy': 600
}
Run Code Online (Sandbox Code Playgroud)
为了让读者更好地了解我的项目结构,我在列表中添加了具有一些随机值的第二个元素。我的项目结构是:
我的问题是,
我正在尝试使用python标准化SPARK DataFrame中的列。
我的数据集:
--------------------------
userID|Name|Revenue|No.of.Days|
--------------------------
1 A 12560 45
2 B 2312890 90
. . . .
. . . .
. . . .
--------------------------
Run Code Online (Sandbox Code Playgroud)
在此数据集中,除了userID和Name外,我必须对收入和天数进行标准化。
输出应如下所示
userID|Name|Revenue|No.of.Days|
--------------------------
1 A 0.5 0.5
2 B 0.9 1
. . 1 0.4
. . 0.6 .
. . . .
--------------------------
Run Code Online (Sandbox Code Playgroud)
用于计算或标准化各列中的值的公式为
val = (ei-min)/(max-min)
ei = column value at i th position
min = min value in that column
max = max value in that column
Run Code Online (Sandbox Code Playgroud)
如何使用PySpark轻松完成此操作?
我有两个数据框。在 dataframe1 中,我有一列包含一些空值。我想通过比较每个数据帧的不同列的值,使用另一个数据帧(即 dataframe2)的值来填充这些空值。
数据框1:
Col1 Col2
A Null
B Null
C NUll
A 1000
B 1120
C 3200
Run Code Online (Sandbox Code Playgroud)
数据框2:
Col1 Col2
A 500
B 110
C 320
Run Code Online (Sandbox Code Playgroud)
现在我想用第二个数据帧中的值填充第一个数据帧中的空值,其中 dataframe1.col1 = dataframe2.col1
最终期望的输出如下:
Col1 Col2
A 500
B 110
C 320
A 1000
B 1120
C 3200
Run Code Online (Sandbox Code Playgroud)
我怎样才能在 Pandas Dataframes 中做到这一点。
我有一个DataFrame,其中一列有值列表(每个值都是一个特征的值).现在我需要将这些值列表转换为每列.
例如:DataFrame有两列,其中数据列是值列表
Run Code Online (Sandbox Code Playgroud)data , Time [1,2,3,4], 12:34 [5,6,7,8], 12:36 [9,1,2,3], 12:45
我需要转换为
例如:
data0 data1 data2 data3 Time
1 , 2 , 3 , 4 , 12:34
5 , 6 , 7 , 8 , 12:36
9 , 1 , 2 , 3 , 12:45
Run Code Online (Sandbox Code Playgroud)
我怎样才能有效地做到这一点?
我有一个示例图,其中有两种类型的节点:服务器和服务。
服务器和属性如下所示:
Server:{
"ip":"0.0.1.1"},
"location":"india",
"uptime":"120",
"services":["httpd","IPsec","irqbalance"],
}
Run Code Online (Sandbox Code Playgroud)
服务在哪里:
service:{
"service":"httpd"}
Run Code Online (Sandbox Code Playgroud)
服务器很容易用 ip 识别,但服务不是。我想在节点上显示服务属性。怎么做?
我想通过将另一列上的值分组来对一列应用自定义操作。按列分组以获取计数,然后将所有分组记录的另一个列值除以该计数。
我的数据框:
emp opp amount
0 a 1 10
1 b 1 10
2 c 2 30
3 b 2 30
4 d 2 30
Run Code Online (Sandbox Code Playgroud)
我的情况:
最终输出数据帧:
emp opp amount
0 a 1 5
1 b 1 5
2 c 2 10
3 b 2 10
4 d 2 10
Run Code Online (Sandbox Code Playgroud)
最好的办法是什么
尝试从RDD创建DataFrame时遇到错误。
我的代码:
from pyspark import SparkConf, SparkContext
from pyspark import sql
conf = SparkConf()
conf.setMaster('local')
conf.setAppName('Test')
sc = SparkContext(conf = conf)
print sc.version
rdd = sc.parallelize([(0,1), (0,1), (0,2), (1,2), (1,10), (1,20), (3,18), (3,18), (3,18)])
df = sql.SQLContext.createDataFrame(rdd, ["id", "score"]).collect()
print df
Run Code Online (Sandbox Code Playgroud)
错误:
df = sql.SQLContext.createDataFrame(rdd, ["id", "score"]).collect()
TypeError: unbound method createDataFrame() must be called with SQLContext
instance as first argument (got RDD instance instead)
Run Code Online (Sandbox Code Playgroud)
我在spark shell中完成了相同的任务,其中直接的最后三行代码将打印这些值。我主要怀疑import语句,因为这是IDE和Shell之间的区别。
python ×7
apache-spark ×4
pyspark ×4
pandas ×3
dataframe ×2
apply ×1
chi-squared ×1
cypher ×1
neo4j ×1
numpy ×1
py2neo ×1
python-2.7 ×1
scipy ×1
scrapy ×1
statistics ×1